我继承了一个总体上具有可疑代码质量的Silverlight项目,并且有一个构造我不确定是否应该触摸它:
public SomeClass Self
{
get
{
return this;
}
}
它在XAML Bindings中使用,带有参数,有时像这样复杂:
Visibility="{Binding Self, ConverterParameter=!, Converter={StaticResource SmartAssConverter}}"
它用于PropertyChanged通知(MVVM Light):
RaisePropertyChanged("Self");
那么,有什么东西阻止我这样做:
Visibility="{Binding ConverterParameter=!, Converter={StaticResource SmartAssConverter}}"
,我测试过,仍然表现得很好?
重新提出我的问题,是否有必要“改变财产改变”迫使这种(恕我直言)丑陋的构造?
编辑:再次改写,是否有一个更优雅的解决方案来通知绑定控件他们的目标已经改变,或者我应该考虑重新转换转换器?
答案 0 :(得分:2)
如果对象(即Self
)发生变化怎么办?使用Self
属性时,您可以利用INotifyPropertyChanged接口告知绑定更新。如果删除该属性,那么您将如何更新?
您可以尝试RaisePropertyChanged(string.Empty)
,但我认为这不起作用。
通常,转换器只会传递它们需要的属性,而不是整个对象。但是在Silverlight中,没有MultiBinding,所以你只能使用一个属性。
您可以向对象添加一个新属性,该属性执行与转换器相同的操作,或者将其与另一个添加该属性的对象一起包装。这通常是视图模型的作用。
答案 1 :(得分:1)
我通常实现IChangeTracking和INotifyPropertyChanged接口,然后在默认构造函数中执行以下操作:
public SomeClass()
{
this.PropertyChanged += new PropertyChangedEventHandler(OnNotifiedOfPropertyChanged);
}
private void OnNotifiedOfPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e != null && !String.Equals(e.PropertyName, "IsChanged", StringComparison.Ordinal))
{
this.IsChanged = true;
}
}
IsChanged属性属性更改通知,因此您可以绑定到IsChanged,以便在修改类时收到通知,而无需将类本身公开为“Self”属性。
答案 2 :(得分:1)
你所展示的代码看起来有些笨拙,但我认为它不是那么糟糕,需要重新设计。你是对的,你可以完全删除路径,这将适用于绑定的一次性评估。然而,令人担忧的部分是代码为“Self”引发属性更改,以便重新评估绑定(很棒的黑客......我会记住以后的使用!)
这里的正确的方法是更改DataContext本身,这实际上是'self'的更改,并将导致重新评估所有绑定。
就个人而言,我不会花太多时间,我看到的情况要糟糕得多!