我遇到了一个看似很奇怪的问题,我不确定这是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