WPF:MvvmLight、用户控件、绑定

WPF : MvvmLight, Usercontrol, Binding

我有一个简单的用户控件 (DoubleRadioControl2),由 2 个单选按钮组成。我在这个 UC 上有一个 Dep Prop : (bool?)IsOuiChecked :

很简单。

private static readonly DependencyProperty IsOuiCheckedProperty = DependencyProperty.Register("IsOuiChecked", typeof(bool?), typeof(DoubleRadioControl2), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

public bool? IsOuiChecked
{
    get
    {
        return (bool)GetValue(IsOuiCheckedProperty);
    }
    set
    {
        SetValue(IsOuiCheckedProperty, value);
        if (value == null)
        {
            RadioYes.IsChecked = false;
            RadioNo.IsChecked = false;
        }
        else
        {
            RadioYes.IsChecked = (bool) value;
            RadioNo.IsChecked = !(bool) value;
        }
    }
}

这两个收音机之间的逻辑:

private void OptDecompteConfnOui_Click(object sender, RoutedEventArgs e)
    {
        IsOuiChecked = true;
    }

private void OptDecompteConfnNon_Click(object sender, RoutedEventArgs e)
    {
        IsOuiChecked = false;
    }

当我将此 UC 绑定到我的视图模型时,如果在我单击收音机时更新了绑定的道具。但是当我在视图模型的代码中设置值时,它不会更新我的收音机。

在我的视图模型中:

    private bool? _isDRB2OuiChecked;
    public bool? IsDRB2OuiChecked
    {
        get
        {
            return _isDRB2OuiChecked;
        }

        set
        {
            if (_isDRB2OuiChecked == value)
            {
                return;
            }
            _isDRB2OuiChecked = value;
            RaisePropertyChanged(() => IsDRB2OuiChecked);
        }
    }

TwoWay 绑定无效。

如果您使用的是 MVVM,则应调用 OnPropertyChanged

getters 和 setters 为您的依赖项 属性 存在只是为了 您的(程序员)方便。 WPF本身不会调用它们,而是直接设置属性。

您需要将处理程序附加到 属性 的更改事件。使用带有 PropertyChangedCallback FrameworkPropertyMetadata 构造函数之一。您的 getter 和 setter 逻辑需要在那里处理,而不是在 属性.

内部处理

首先,这是一个非常糟糕的做法,将代码放入依赖项 Get/Set 的部分 属性,查看这些示例以获得解决方案。如果您有 DP 更改的逻辑,则必须将该登录放在回调中。

  1. 依赖属性说明here.
  2. MSDN 概述here

如果在 View/Viewmodel 级别定义了绑定,则必须在 Viewmodel 端使用 INotifyPropertyChange 事件来通知 View 绑定 属性 已更改。

问候,