Silverlight中的SetBinding()会发生什么

时间:2012-04-03 12:02:10

标签: c# .net silverlight binding

我有以下代码,这是将空值绑定到ComboBox的解决方法的一部分。 (我们假设我不支持更改此实现)。

    SetBinding(ComboBox.SelectedValueProperty, _cachedBinding);

问题是:这行代码会导致源更新目标,反之亦然吗?

所以如果我在视图模型中有这个属性:

 string MyProperty
 {
     get { return _myProperty; }
     set 
     {
        myProperty = value;
        IsDirty = true;
     }
 }

然后在我拨打SetBinding时会调用setter。这将是麻烦的,因为在setter我也管理`IsDirty属性来跟踪变化。我可以编码:

 string MyProperty
 {
     get { return _myProperty; }
     set 
     {  
        if (myProperty != value)
        {
           myProperty = value;
           IsDirty = true;
        }
     }
 }

但我觉得这样会很不雅,因为我有很多属性。

所以我的第二个问题是(假设第一个问题的答案是肯定的),我可以强制Silverlight在SetBinding()之后不更新目标或来源(因此他们只会在他们更新时更新改变了吗?

这项工作方式如何运作:http://surrealization.com/sample-code/fixing-combobox-selectedvalue-bug-with-expression-behaviors/_cachedBinding因此包含在MyProperty成为null之前设置的绑定,并且绑定消失了(因此它与那里的绑定相同(尽管它与对象不同,因为它是重新创建的) ))。

再次查看代码,这可能是同一个对象,但这取决于GetBindingExpressionParentBinding在.NET中的工作方式。

这是完全绑定的Combobox子类:

public class ComboBoxFixedBinding : ComboBox
{
    #region Events

    private void ComboBoxEx_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        if (SelectedValue == null)
        {
            if (_cachedBinding != null && GetExistingBinding() == null)
            {
                SetBinding(ComboBox.SelectedValueProperty, _cachedBinding);
            }
        }
        else
        {
            CacheExistingBinding();
        }
    }

    private void CacheExistingBinding()
    {
        Binding binding = GetExistingBinding();

        if (binding != null)
        {
            _cachedBinding = binding;
        }
    }

    private Binding GetExistingBinding()
    {
        BindingExpression bindingExpr = this.GetBindingExpression(ComboBox.SelectedValueProperty);
        if (bindingExpr == null)
        {
            return null;
        }
        else
        {
            return bindingExpr.ParentBinding;
        }

    }

    #endregion

    public ComboBoxFixedBinding()
    {
        SelectionChanged += ComboBoxEx_SelectionChanged;
    }

    private Binding _cachedBinding;
}

0 个答案:

没有答案