在c# /Silverlight中,我可以直接通过更新依赖属性绑定的源对象来改变依赖属性吗?

本文关键字:依赖 属性 绑定 对象 改变 更新 Silverlight 我可以 | 更新日期: 2023-09-27 18:19:17

我在c#/Silverlight中有一个带有datetime属性的自定义日期拾取器元素,该属性绑定到source属性。当我通过日期选择器更改日期时,它会正确地更新源属性,但有时,由于日期无效,我需要立即将源属性设置回其先前的值,并将该更改反映回UI。我能够正确地设置源对象,然后正确地重置它,但是我无法设法将日期选择器更改回其原始日期。注意,我指的不是格式无效的无效日期,基本上只是这个日期已经被"占用"了。

我认为问题是,我试图设置依赖对象上的自定义日期拾取器,而它是在从最后一个设置动作发射其绑定的中间。澄清一下:在UI中更改了数据拾取器,它更新了自定义数据拾取器中的依赖对象,该对象触发绑定,该绑定更新源属性,从而导致源属性将自身设置回其先前的值,由于它仍然处于设置为用户在UI中选择的值的过程中,因此无法再次设置依赖对象。

一个依赖对象可以被设置为新的东西作为设置它引起的事件链的一部分吗?是否有任何方法可以正确地实现这一点,或者以某种方式解决这个问题?有没有可能是我误诊了?

自定义日期拾取器元素基本上是一个标准的日期拾取器包装与其他几个UI元素,但我相信我将有相同的问题,如果它只是标准的日期拾取器

在c# /Silverlight中,我可以直接通过更新依赖属性绑定的源对象来改变依赖属性吗?

您可以尝试使用Dispatcher.BeginInvoke()来延迟重新调整源属性的代码片段的执行:

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
    sourceProperty = newValue;
});

另外,您可能想要考虑使用内置的数据验证功能,而不是上面提到的方法。

您可以这样使用(在视图模型中):

public DateTime Date
{
    get { return _date; }
    set
    {
        if (value [is _not_in_range_])
            throw new Exception("Value is not in range");
        _date = value;
    }
}

示例:http://msdn.microsoft.com/en-us/library/cc278072 (VS.95) . aspx