У меня есть пользовательский элемент управления, у которого есть кнопка и свойство зависимости для действия, которое должна выполнить кнопка. Страница, содержащая элемент управления, устанавливает действие в XAML.Привязать действие к свойству UserControl в XAML
MyUserControl.cs
кнопку, и свойство зависимостей ButtonAction
, типа Action
. Когда кнопка нажата, она выполняет команду ButtonAction
.
MainPage.xaml.cs
Действие Action1
Действие Мотор2
MainPage.xaml
Present экземпляр MyUserControl
с ButtonAction = действий1
Проблема: Свойство ButtonAction не назначается из XAML
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>
Это делает работу, если в коде-позади для MainPage (MainPage.xaml.cs
) Поручаю действие в Loaded
случае.
private void Page_Loaded(object sender, RoutedEventArgs e) {
this.myUserControl.ButtonAction = Action1;
}
В этом случае также вызывается обратный вызов PropertyChanged в пользовательском элементе управления. (Этот обработчик предоставляется только для диагностических целей. Я не вижу, как его можно использовать для поддержки свойства на практике).
Что такое DataContext от MainPage? Если это не страница, вам нужно установить ButtonAction = "{Binding Action1, ElementName = x: name MainPage}" – Dani
MainPage не имеет контекста данных, но он отлично работает, когда это действие назначается в коде- за. Я попробовал ваше предложение (задал имя страницы и ElementName), и это не имело никакого значения. Но все равно спасибо. –