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 № 1Powinieneś 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...);
}