Ste*_*ing 5 windows-runtime winrt-xaml
我有一个用户控件,它有一个按钮和一个依赖属性,用于执行按钮的操作.包含该控件的页面在XAML中设置操作.
MyUserControl.cs
一个按钮,依赖属性ButtonAction类型,Action.单击该按钮时,它将执行ButtonAction.
MainPage.xaml.cs中
行动1
行动2
MainPage.xaml中
MyUserControl使用ButtonAction = Action1呈现一个实例
问题:未从XAML分配ButtonAction属性
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
MyUserControl.xaml
<Grid>
<Button Click="Button_Click">Do The Attached Action!</Button>
</Grid>
Run Code Online (Sandbox Code Playgroud)
MainPage.xaml.cs中
Action Action1 = (
() => { Debug.WriteLine("Action1 called"); });
Action Action2 = (() => { Debug.WriteLine("Action2 called"); });
Run Code Online (Sandbox Code Playgroud)
MainPage.xaml中
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<local:MyUserControl x:Name="myUserControl" ButtonAction="{Binding Action1}"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)
如果在MainPage()的代码隐藏中我在事件中分配动作,它确实有效.MainPage.xaml.csLoaded
private void Page_Loaded(object sender, RoutedEventArgs e) {
this.myUserControl.ButtonAction = Action1;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,还会调用用户控件中的PropertyChanged回调.(此处理程序仅用于诊断目的.我无法在实践中看到它如何用于支持该属性).
问题出在您的数据绑定中。in应该是公共属性Action1,而您将其定义为私有变量。ButtonAction="{Binding Action1}"
另外,您不能像这样直接在后面的代码中声明普通属性。您将需要一个依赖属性,或者更常见的是,在实现INotifyPropertyChanged.
如果我们采用第二种方法,我们将需要创建一个带有属性的视图模型类,如下所示Action1。请注意,这些OnPropertyChanged内容只是实现的标准方法INotifyPropertyChanged。
public class ViewModel : INotifyPropertyChanged
{
private Action _action1;
public Action Action1
{
get { return _action1; }
set
{
_action1 = value;
OnPropertyChanged("Action1");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后您只需将其分配给DataContext您的主页即可。
public MainPage()
{
this.InitializeComponent();
var vm = new ViewModel();
vm.Action1 = (() =>
{
Debug.WriteLine("Action1 called");
});
this.DataContext = vm;
}
Run Code Online (Sandbox Code Playgroud)
通过这两项更改,您的ButtonAction回调现在应该会被触发。:)
| 归档时间: |
|
| 查看次数: |
1097 次 |
| 最近记录: |