Sergio0694
Sergio0694

Reputation: 4567

x:Bind to DependencyProperty not working (classic Binding works fine)

I'm having some problems porting my classic bindings to the new compiled bindings in a UWP app.

I have a UserControl with a simple 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
}

In my page code-behind file I assign the DataContext and create a Parameter for the compiled binding:

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

public MyPageViewModel ViewModel => (MyPageViewModel)DataContext;

Now, this classic binding works (the target Parameter has the INotifyPropertyChanged interface correctly implemented):

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

But this compiled binding doesn't:

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

The compiler doesn't give me an error, so it does find the target property when it builds the app, but at runtime it just doesn't work.

I guess I'm missing something really obvious and stupid here, but I just don't know what it is exactly. Thank you in advance for your help!

Upvotes: 6

Views: 1531

Answers (1)

Igor Ralic
Igor Ralic

Reputation: 15006

The most annoying difference between the "classic" Binding and the latest compiled binding (x:Bind) is the default binding mode. For classic Binding, the default is OneWay but for x:Bind the default is OneTime, so when you change the property value it doesn't reflect in the UI because the binding just picks up the value once and doesn't care for any future change notifications.

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

Upvotes: 9

Related Questions