我有以下代码,这是将空值绑定到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
之前设置的绑定,并且绑定消失了(因此它与那里的绑定相同(尽管它与对象不同,因为它是重新创建的) ))。
再次查看代码,这可能是同一个对象,但这取决于GetBindingExpression
和ParentBinding
在.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;
}