Laden...

ToggleButton im UserControl: RoutedEvent oder ICommand ?

Erstellt von snupi vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.077 Views
S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren
ToggleButton im UserControl: RoutedEvent oder ICommand ?

Ich habe in einem UserControl einen RadioButton (Style=ToggleButton). Um die View (bzw. das ViewModel) über den Checked-Status zu informieren, habe ich ein RoutedEvent bereitgestellt (CheckedChangedEvent), welches im Checked-Eventhandler des RadioButtons ausgelöst wird:


        private void rdBtn_Checked(object sender, RoutedEventArgs e) {
            RoutedPropertyChangedEventArgs<bool> args =
                new RoutedPropertyChangedEventArgs<bool>(false, true);
            args.RoutedEvent = CheckedChangedEvent;

            RaiseEvent(args);
        }

Im Code-Behind der MainView, welches das UserControl beinhaltet, rufe ich dann im CheckedChangedEventHandler eine entsprechende Funktion im MainViewModel auf.

Das funktioniert soweit so gut.

Nun habe ich dem UserControl (genauer gesagt dem RadioButton) auch die Möglich eines Commands verpasst:


    <RadioButton Name="rdBtn"
                 Command="{Binding SomeCommand, ElementName=rootControl}" CommandParameter="{Binding ElementName=rootControl, Path=Name}" Style="{StaticResource {x:Type ToggleButton}}" GroupName="{Binding ElementName=rootControl,Path=GroupName}" Checked="rdBtn_Checked">
    </RadioButton>

Weise ich in der MainView dem UserControl nun ein eigenes Command zu:


<local:MyUC Name="dummy" SomeCommand="{Binding BtnCommand}" />

dann wird dieses Command bei jedem Click auf den Button ausgeführt, auch wenn dieser bereits 'Checked' ist.

Hinsichtlich MVVM:

Ist es hier sinnvoller, die Variante mit dem RoutedEvent zu nehmen oder lässt sich die Variante mit dem ICommand so modifizieren, dass das Command nur bei IsChecked=False exekutiert wird ?

U
16 Beiträge seit 2009
vor 11 Jahren

Hallo snupi,

also ich würde da

<i:Interaction.Triggers>
	<i:EventTrigger EventName="Checked" >
		<commands:EventToCommand Command="{Binding CheckedToCommand}" />
	</i:EventTrigger>
</i:Interaction.Triggers>

aus dem MVVM Light Toolkit nehmen

MFG Uwe

5.299 Beiträge seit 2008
vor 11 Jahren

ich würd glaub eine bool Property des Viewmodels an die IsChecked-Property binden

Der frühe Apfel fängt den Wurm.

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

@uwalter: MVVM Light Toolkit muss ich mir mal genauer anschauen - danke für den tip.
@ErfinderDesRades: die IsChecked-Property des RadioButtons muss ich aber dann halt nochmals im UserControl abbilden (um sie von aussen zugänglich zu machen)

5.299 Beiträge seit 2008
vor 11 Jahren

@ErfinderDesRades: die IsChecked-Property des RadioButtons muss ich aber dann halt nochmals im UserControl abbilden (um sie von aussen zugänglich zu machen) nö. einfach im Xaml Radiobutton.IsChecked an die dafür vorzusehende Viewmodel-Property binden.

wüsste nix von "abbilden und zugänglich machen"

Der frühe Apfel fängt den Wurm.

S
snupi Themenstarter:in
357 Beiträge seit 2007
vor 11 Jahren

a ok muss ich ausprobieren