Ich habe ein Benutzersteuerelement mit einer Schaltfläche und einer Abhängigkeitseigenschaft für die Aktion, die die Schaltfläche ausführen soll. Die Seite, die das Steuerelement enthält, legt die Aktion in XAML fest.Eine Aktion an eine Eigenschaft eines UserControls in XAML binden
MyUserControl.cs
A-Knopf und Abhängigkeitseigenschaft ButtonAction
vom Typ Action
. Wenn die Schaltfläche angeklickt wird, wird die ButtonAction
ausgeführt.
MainPage.xaml.cs
Aktion Action1
Aktion Action2
MainPage.xaml
Präsens eine Instanz von MyUserControl
, mit ButtonAction = Action1
Das Problem: Die ButtonAction Eigenschaft wird nicht von dem XAML zugewiesen
MyUserControl.cs
public sealed partial class MyUserControl : UserControl
{
public Action ButtonAction {
get { return (Action)GetValue(ButtonActionProperty); }
set { SetValue(ButtonActionProperty, value); }
}
public static readonly DependencyProperty ButtonActionProperty =
DependencyProperty.Register("ButtonAction", typeof(Action), typeof(MyUserControl), new PropertyMetadata(null,ButtonAction_PropertyChanged));
private static void ButtonAction_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
Debug.WriteLine("ButtonAction_PropertyChanged");
// Is not called!
}
public MyUserControl() {
this.InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e) {
if (ButtonAction != null) {
// Never reaches here!
ButtonAction();
}
}
}
MyUserControl.xaml
<Grid>
<Button Click="Button_Click">Do The Attached Action!</Button>
</Grid>
MainPage.xaml.cs
Action Action1 = (
() => { Debug.WriteLine("Action1 called"); });
Action Action2 = (() => { Debug.WriteLine("Action2 called"); });
MainPage.xaml
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<local:MyUserControl x:Name="myUserControl" ButtonAction="{Binding Action1}"/>
</Grid>
Es tut Arbeit, wenn in der Code-Behind für Mainpage (MainPage.xaml.cs
) ich die Aktion in dem Loaded
Ereignisse zuordnen.
private void Page_Loaded(object sender, RoutedEventArgs e) {
this.myUserControl.ButtonAction = Action1;
}
In diesem Fall wird auch der PropertyChanged-Callback im Benutzersteuerelement aufgerufen. (Dieser Handler wird nur für Diagnosezwecke zur Verfügung gestellt. Ich kann nicht sehen, wie er verwendet werden kann, um die Eigenschaft in der Praxis zu unterstützen).
Was ist der DataContext von der MainPage? Wenn es nicht die Seite ist, dann müssen Sie ButtonAction setzen = "{Binding Action1, ElementName = x: Name der MainPage}" – Dani
Die MainPage hat keinen Datenkontext - aber es funktioniert gut, wenn die Aktion im Code zugewiesen ist- hinter. Ich habe deinen Vorschlag ausprobiert (setze den Namen der Seite und ElementName) und es machte keinen Unterschied. Danke trotzdem. –