【问题标题】:x:Bind to DependencyProperty not working (classic Binding works fine)x:绑定到 DependencyProperty 不起作用(经典绑定工作正常)
【发布时间】:2016-01-10 02:38:52
【问题描述】:

我在将经典绑定移植到 UWP 应用中新编译的绑定时遇到了一些问题。

我有一个带有简单 DependencyProperty 的 UserControl:

public double Value
{
    get { return (double)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register(nameof(Value), typeof(double), typeof(MyUserControl),
    new PropertyMetadata(0d, OnValuePropertyChanged));

private static void OnValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    // Get the new value and do stuff on the control
}

在我的页面代码隐藏文件中,我分配 DataContext 并为编译的绑定创建一个参数:

public MyPage()
{
    this.InitializeComponent();
    DataContext = new MyPageViewModel();
}

public MyPageViewModel ViewModel => (MyPageViewModel)DataContext;

现在,这个经典绑定工作(目标参数正确实现了 INotifyPropertyChanged 接口):

<controls:MyUserControl Value="{Binding MyValue}"/>

但是这个编译的绑定没有

<controls:MyUserControl Value="{x:Bind ViewModel.MyValue}"/>

编译器没有给我一个错误,所以它在构建应用程序时确实找到了目标属性,但在运行时它就不起作用了。

我想我在这里遗漏了一些非常明显和愚蠢的东西,但我只是不知道它到底是什么。提前感谢您的帮助!

【问题讨论】:

    标签: c# wpf xaml windows-runtime uwp


    【解决方案1】:

    “经典”绑定和最新编译的绑定(x:Bind)之间最烦人的区别是默认绑定模式。对于经典 Binding,默认值为 OneWay,但对于 x:Bind,默认值为 OneTime,因此当您更改属性值时,它不会反映在 UI 中,因为绑定只会获取一次值并且不会留意任何未来的变更通知。

    Value="{x:Bind ViewModel.MyValue, Mode=OneWay}"
    

    【讨论】:

    • 这正是我认为我可能会错过的那种明显而愚蠢的事情啊哈哈哈谢谢!
    • 这拯救了我的一天。默认行为如何可能是 OneTime ?在这种情况下不需要绑定东西,imo
    • 我唯一想到的是,如果您要绑定到只读属性或从视图模型构造函数分配的属性
    猜你喜欢
    • 2012-04-15
    • 2021-11-08
    • 2011-12-25
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多