2014-09-11 17 views
10

Mam ToggleButton w mojej aplikacji C# WPF, w którym chciałbym powiązać jedno polecenie do zdarzenia Checked i jedno polecenie do zdarzenia Unchecked.Powiązanie poleceń z ToggleButton Sprawdzone i niezaznaczone zdarzenia

co mam obecnie jest następujący:

<ToggleButton Name="btnOpenPort" Style="{StaticResource myOnOffBtnStyle}" Content="Open Port" 
       Checked="btnOpenPort_Checked" Unchecked="btnOpenPort_Unchecked" 
       IsChecked="{Binding Path=PortViewModel.PortIsOpen, Mode=OneWay}" 
       Canvas.Left="75" Canvas.Top="80" Height="25" Width="100"/> 

Ale to nie jest to, co staram się robić. Ponieważ w tym przypadku musiałbym ustawić właściwości w kodzie za zdarzeń Checked i Unchecked. Zamiast tego chciałbym wywołać komendę (ICommand) w moim ViewModelu po uruchomieniu zdarzenia Checked lub Unchecked, więc nie potrzebuję żadnego kodu za moim przełącznikiem.

Czy istnieje sposób powiązania polecenia bezpośrednio dla tych dwóch zdarzeń w XAML? Podobne do właściwości polecenia kontrolki przycisku "standard" w WPF?

EDIT Jak to działa w odniesieniu do @ har07 podpowiedź:

1: Dodano odniesienia, jeśli nie masz go jeszcze:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 

2: Zaimplementowane Interaction.Triggers dla sprawdzone i Niezaznaczone zdarzenia:

<ToggleButton 
     Name="btnOpenPort" Style="{StaticResource myOnOffBtnStyle}" Content="Open Port" 
     IsChecked="{Binding Path=PortViewModel.PortIsOpen, Mode=OneWay}" 
     Canvas.Left="75" Canvas.Top="80" Height="25" Width="100"> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Checked"> 
       <i:InvokeCommandAction Command="{Binding Path=PortViewModel.OpenPort}"/> 
      </i:EventTrigger> 
      <i:EventTrigger EventName="Unchecked"> 
       <i:InvokeCommandAction Command="{Binding Path=PortViewModel.ClosePort}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
</ToggleButton> 

Dzięki temu rozwiązaniu nie muszę zmieniać pojedynczej linii kodu i n mój ViewModel lub mój kod za. Mogę po prostu zadzwonić do mojego ICommandu, tak jak zrobiłbym to standardowym przyciskiem podążając za wzorcem MVVM.

Odpowiedz

6

Można umieścić logiki uchwyt zaznaczone/odznaczone wydarzeniem w setter PortIsOpen nieruchomości:

private bool _portIsOpen; 
public bool PortIsOpen 
{ 
    get { return _portIsOpen; } 
    set 
    { 
     if(value) HandleCheckedEvent(); 
     else HandleUnCheckedEvent(); 
     .... 
    } 
} 

Albo można użyć Ineraction.Triggers rozszerzenie powiązać zdarzenie commmand: WPF Binding UI events to commands in ViewModel

+0

Zaimplementowałem go za pomocą Ineraction.Triggers. To po prostu działa idealnie! To dokładnie to, czego potrzebuję! Dziękuję bardzo! – ck84vi

-1
<ToggleButton Name="btnOpenPort" Style="{StaticResource myOnOffBtnStyle}" Content="Open Port" 
       Checked="{Binding ICommand}" Unchecked="{Binding ICommand}" 
       IsChecked="{Binding Path=PortViewModel.PortIsOpen, Mode=OneWay}" 
       Canvas.Left="75" Canvas.Top="80" Height="25" Width="100"/> 

Zamień ICommand na swoją nazwę właściwości ICommand.

+0

To podejście rzuca wyjątek XamlParseException - "Podaj wartość na" System.Windows.Data.Binding "zwrócił wyjątek." - wskazując na linię, w której Bind the ICommand. _ {"Nie można rzucić obiektu typu" System.Reflection.RuntimeEventInfo ", aby wpisać" System.Reflection.MethodInfo "."} _. – ck84vi

13

możesz nie być w stanie powiązać dwóch poleceń dla każdego zaznaczonego i niezaznaczonego bezpośrednio, ale nadal możesz powiązać polecenie, które zostanie wywołane dla obu. masz również opcję dołączonych zachowań, jeśli potrzebujesz różnych poleceń dla obu wydarzeń.

<ToggleButton Command="{Binding MyCommand}"/> 

w VM

public ICommand MyCommand { get; private set; } 

trzeba będzie go zainicjować odpowiednio

i określenia aktualnego stanu może masz stan na związanej własności PortIsOpen

void Execute(object state) 
{ 
    if(PortIsOpen) 
    { 
     //checked 
    } 
    else 
    { 
     //unchecked 
    } 
} 

lub może również przekazać go jako parametr

np

<ToggleButton Command="{Binding MyCommand}" 
       CommandParameter="{Binding IsChecked,RelativeSource={RelativeSource Self}}"/> 

i używać go jako

void Execute(object state) 
{ 
    if((bool)state) 
    { 
     //checked 
    } 
    else 
    { 
     //unchecked 
    } 
} 
7

Może używamy eventtriggers

<ToggleButton> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="Checked"> 
       <i:InvokeCommandAction Command="{Binding Path=CheckedCommand}"/> 
      </i:EventTrigger> 
      <i:EventTrigger EventName="Unchecked"> 
       <i:InvokeCommandAction Command="{Binding Path=UncheckedCommand}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </ToggleButton> 

używać wyzwalaczy musimy odwoływać System.Windows.Interactivity

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
+0

Thx, to jest dokładnie to, co zrobiłem. @ har07 s link odnosi się dokładnie do tego podejścia. Właśnie zaktualizowałem swój wpis kilka minut temu dokładnie do tego podejścia! – ck84vi

+0

Cieszę się, że rozwiązałeś swój problem, przepraszam, nie miałem zamiaru podwójnie pisać, nie widziałem podanego linku – user3473830

Powiązane problemy