/ / Jak poprawnie przekazać RoutedEventHandler do UserControl? - wpf, wiązanie danych, zdarzenia routowane

Jak poprawnie przekazać RoutedEventHandler do UserControl? - wpf, wiązanie danych, zdarzenia routowane

mam UserControl c:MenuButtons z ItemsControl i ItemTemplate jest DataTemplate z a RadioButton.

W głównym oknie wpf używam UserControl lubię to:

<c:MenuButtons x:Name="MenuProjects"
SelectionChanged="{Binding d:MenuClick}"
Height="35"
MenuItems="{Binding Source={x:Static d:Main.Projects}}" />

Chciałbym mieć Checked wydarzenie RadioButton bańka się przez UserControl do MenuClick handler w głównym oknie kodu i zajmij się nim. To jest tylko widok, więc nie używam ICommand lub wzorce modeli tutaj.

The RadioButton Checked wydarzenie jest RoutedEventHandler, więc jest SelectionChanged w c:MenuButtons i również MenuClick w moim głównym oknie z tyłu kodu.

Nie mogę zmusić go do działania.

W klasie MenuButtons mam następujący kod:

RoutedEventHandler handler;
public event RoutedEventHandler SelectionChanged
{
add { handler += value; }
remove { handler -= value; }
}

ale dodawanie nie jest wprowadzane pomimo powiązania danych. Dlaczego nie?

I: przypuśćmy, że to będzie związane, jak powinienem zadeklarować wiązanie w DataTemplate?
próbowałem Checked="{Binding ElementName=root, Path=SelectionChanged}" która daje wyjątek XamlParseException dla tej konkretnej próby wiązania (nie można rzucić obiektu typu "System.Reflection.RuntimeEventInfo", aby wpisać "System.Reflection.MethodInfo".)

Okazuje się to proste:
W klasie MenuButtons otrzymasz:

public static readonly RoutedEvent SelectionChangedEvent = EventManager.RegisterRoutedEvent("SelectionChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MenuButtons));

public event RoutedEventHandler SelectionChanged
{
add { AddHandler(SelectionChangedEvent, value); }
remove { RemoveHandler(SelectionChangedEvent, value); }
}
private void RadioButton_Checked(object sender, RoutedEventArgs e)
{
RoutedEventArgs eventargs = new RoutedEventArgs(MenuButtons.SelectionChangedEvent);
RaiseEvent(eventargs);
}

W Xaml z UserControl dodajesz:

<RadioButton Checked="RadioButton_Checked"

W głównej formie masz:

 <c:MenuButtons SelectionChanged="MenuProjects_SelectionChanged"

Na szczęście e.OriginalSource podaje informacje dotyczące obsługi zdarzenia.

Odpowiedzi:

2 dla odpowiedzi № 1

Powinieneś sprawdzić te linki:

http://msdn.microsoft.com/en-us/library/ms752288.aspx

A także to:

http://msdn.microsoft.com/en-us/library/ms742806.aspx

Samouczki pokażą Ci, jak tworzyć zdarzenia routowane i jak je prawidłowo subskrybować.

Btw, add { handler += value; } jest źle.

Tak powinieneś go napisać: add { this.AddHandler(MyRoutedEvent...); }