WPF : MvvmLight, Usercontrol, Binding

本文关键字:Usercontrol Binding MvvmLight WPF | 更新日期: 2023-09-27 18:18:16

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

  • true - 'yes'选中
  • false -选中"no"单选
  • null -两者都有收音机不

相当简单。

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绑定到我的视图模型时,当我点击我的无线电时,绑定的道具就会更新。但是当我在视图模型的代码中设置值时,它不会更新我的无线电。

In my viewmodel:

    private bool? _isDRB2OuiChecked;
    public bool? IsDRB2OuiChecked
    {
        get
        {
            return _isDRB2OuiChecked;
        }
        set
        {
            if (_isDRB2OuiChecked == value)
            {
                return;
            }
            _isDRB2OuiChecked = value;
            RaisePropertyChanged(() => IsDRB2OuiChecked);
        }
    }

双向绑定不工作

WPF : MvvmLight, Usercontrol, Binding

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

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

如果你正在使用MVVM,你应该调用OnPropertyChanged

首先,这是一个非常坏的做法,把代码放在依赖属性的Get/Set部分,看看这些例子来获得解决方案。如果您对DP进行了逻辑更改,则必须将该登录放在回调中。

  1. 依赖属性解释在这里。
  2. MSDN概述在这里。

如果在视图/视图模型级别定义了绑定,你必须在视图模型端使用INotifyPropertyChange事件来通知视图绑定的属性被更改。

认为,