将数据绑定依赖属性到数据对象

3

我有一个含有DependencyProperty的DependencyObject:

public class DependencyObjectClass: DependencyObject
{
    public static DependencyProperty BooleanValueProperty = DependencyProperty.Register("BooleanValue", typeof (bool), typeof (DependencyObjectClass));
    public bool BooleanValue
    {
        get { return (bool)GetValue(BooleanValueProperty); }
        set { SetValue(BooleanValueProperty, value); }
    }
}

我还有我的数据源类:

public class DataSource: INotifyPropertyChanged
{
    private bool _istrue;
    public bool IsTrue
    {
        get { return _istrue; }
        set 
        { 
            _istrue = value;
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs("IsTrue"));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

我尝试使用以下代码将上述两个对象进行绑定:
var dependencyObject = new DependencyObjectClass();
var dataSource = new DataSource();
var binding = new Binding("IsTrue");
binding.Source = dataSource;
binding.Mode = BindingMode.TwoWay;
BindingOperations.SetBinding(dependencyObject, DependencyObjectClass.BooleanValueProperty, binding);

每当我改变 DependencyObjectClass 上的 BooleanValue 属性时,DataSource 会做出反应,但反过来(改变 DataSource 上的 IsTrue 属性对 DependencyObjectClass 没有影响)。
我做错了什么?我必须手动处理 OnPropertyChanged 事件吗?如果是的话,那就有点令人失望,因为我原本希望这个可以自动完成。

只是一个旁问,这是什么意图?你正在创建自定义控件吗? - Federico Berasategui
我也曾遇到过绑定布尔属性的问题。如果我们从VM通知相同的值到View,它不会反映在DependencyProperty的setter中。例如,如果您有IsTrue的true值,然后再次将其分配为true,则DependencyProperty的setter不会反映它。这意味着如果您再次设置相同的值,则不会反映到DependencyProperty的setter中。 - yo chauhan
HighCore,我正在非WPF对象上实现MVVM模式。我正在编写一个插件,在其中需要使用一些第三方UI元素,因此我选择将它们包装在自己的类中,这些类派生自DependencyObject。欢迎任何建议。 - jur
1个回答

3

更改数据源上的IsTrue属性对DependencyObjectClass没有任何作用

我猜你是从DependencyObjectClass.BooleanValue属性的setter从未被调用这一事实得出的这个结论。实际上WPF并不会这样做。相反,它直接设置依赖属性的值,就像调用SetValue一样。

请参见定义依赖属性的清单自定义依赖属性的影响进行解释。

为了获得有关更改的依赖属性值的通知,您需要在DependencyProperty.Register中使用依赖属性元数据注册PropertyChangedCallback


谢谢!没想到要检查值,而不仅仅是观察它的访问器。 - jur

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