CoerceValue与POCO对象无法正常工作

时间:2013-07-11 20:29:06

标签: wpf dependency-properties

我遇到了一个看似很奇怪的问题,我不确定这是WPF的错误还是设计功能

我有一个具有依赖项属性的依赖项对象,并且通过值强制强制执行约束,并且在与其他依赖项属性绑定时使用此属性时,一切都按预期工作。

但是当尝试在绑定POCO对象时使用属性时,事情就会崩溃。在这种情况下,当依赖属性更改时,POCO会更新,但在执行值强制之前,会使POCO保持无效/不同步值。

以下是一个例子:

public class TestDO : DependencyObject
{        

    public static DependencyProperty NumberProperty =
        DependencyProperty.Register("Number", typeof(int), typeof(TestDO),
                                    new FrameworkPropertyMetadata(0, FrameworkPropertyMetadataOptions.None, OnNumberChanged, OnNumberCoerce));

    public int Number
    {
        get { return (int)GetValue(NumberProperty); }
        set {  SetValue(NumberProperty, value); }
    }

    private static void OnNumberChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        Console.WriteLine("DepObj: NumberChanged {0} --> {1}", e.OldValue, e.NewValue);            
    }

    private static object OnNumberCoerce(DependencyObject d, object value)
    {
        int cval = (int)value;
        if (cval > 10)
            cval = 10;
        else if (cval < -10)
            cval = 10;

        Console.WriteLine("DepObj: OnNumberCoerce: {0} --> {1}", value, cval);

        return cval;
    }
}

public class TestPOCO
{
    private int _pocoNumber = 0;
    public int PocoNumber
    {
        get { return _pocoNumber; }
        set { _pocoNumber = value; }
    }
}

现在,我们可以创建上述类型的两个实例,并设置绑定和测试设置Number属性。绑定更新了POCO对象,但它在值强制之前就这样做了。

// create a POCO object
var testPoco = new TestPOCO();

// create a dependency object
var testObj = new TestDO();

// create a binding between the NumberProperty of the Dependency Object and the 
// PocoNumber of the POCO object
BindingOperations.SetBinding(testObj, TestDO.NumberProperty, new Binding("PocoNumber")
                {
                    Source = testPoco,
                    Mode = BindingMode.TwoWay
                });

// try setting a value of 100, to trigger value coercion
testObj.Number = 100;   

Console.WriteLine("Poco Number = {0}", testPoco.PocoNumber);  // displays 100
Console.WriteLine("DP Number = {0}", testObj.Number);  // displays 10

如果两个DependencyObjects之间存在绑定,则情况并非如此。在这种情况下,一切都按预期工作。 SetValue --> ValueCoercion --> PropertyChanged --> SetValue

0 个答案:

没有答案