【问题标题】:Can I change a dependency property as a direct result of updating the source object of the binding of that dependency property in C#/Silverlight?我可以更改依赖属性作为更新 C#/Silverlight 中该依赖属性绑定的源对象的直接结果吗?
【发布时间】:2014-10-18 17:12:41
【问题描述】:

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

我认为问题在于我试图在自定义日期选择器上设置依赖对象,而它正在从最后一个设置操作触发其绑定。澄清一下:在 UI 中更改了日期选择器,这会更新自定义日期选择器中的依赖对象,这会触发绑定,从而更新源属性,这会导致源属性将其自身设置回其先前的值,但无法设置再次依赖对象,因为它仍处于被设置为用户在 UI 中选择的值的中间。

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

自定义日期选择器元素基本上是一个标准日期选择器,其中包含一些其他 UI 元素,但我相信如果它只是标准日期选择器,我也会遇到同样的问题。

【问题讨论】:

    标签: c# silverlight xaml data-binding dependency-properties


    【解决方案1】:

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

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

    另外,您可能需要考虑使用the built-in capabilities of data validation 代替上述方法。

    【讨论】:

      【解决方案2】:

      你可以使用这样的东西(在视图模型中):

      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

      【讨论】:

        最近更新 更多