WPF:MvvmLight,Usercontrol,Binding

时间:2015-10-19 13:34:12

标签: c# wpf binding mvvm-light dependency-properties

我有一个简单的usercontrol(DoubleRadioControl2),由2个单选按钮组成。我对这个UC有一个Dep Prop :(布尔?)IsOuiChecked:

  • true - '是'收音机检查
  • false - ' no'收音机检查
  • null - 两者 radios unchecked

非常简单。

Edit->Preferences

两个无线电之间的逻辑:

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;
        }
    }
}

当我将此UC绑定到我的viewmodel时,如果我点击我的无线电时更新了支柱。但是当我在我的视图模型的代码中设置值时,它不会更新我的无线电。

在我的viewmodel中:

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

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

TwoWay绑定不起作用。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

  1. 依赖属性说明here
  2. MSDN概述here
  3. 如果在View / Viewmodel级别定义了绑定,则必须在Viewmodel端使用INotifyPropertyChange事件来通知View绑定属性已更改。

    的问候,