x:Bind无法绑定到DependencyProperty(传统的绑定可以正常工作)

6

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

我有一个带有简单DependencyProperty的用户控件:

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}"/>

编译器没有报错,所以在构建应用程序时它确实找到了目标属性,但在运行时却无效。我猜我可能漏掉了一个非常明显和愚蠢的东西,但我不确定具体是什么。提前感谢你的帮助!
1个回答

9

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

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

1
这正是我认为自己可能会错过的那种显而易见又愚蠢的事情,哈哈哈哈,谢谢! - Sergio0694
这个救了我的一天。默认行为怎么可能是OneTime?在这种情况下不需要绑定任何东西,我认为。 - Nicolas Voron
我能想到的唯一可能是你正在绑定到一个只读属性或者从视图模型构造函数中分配的属性。 - Sergio0694

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接