我从总体上继承了具有可疑代码质量的Silverlight项目,并且有一个结构不确定我是否应该触摸它:
public SomeClass Self
{
get
{
return this;
}
}
它在XAML绑定中使用,带有参数,有时像这样复杂:
Visibility="{Binding Self, ConverterParameter=!, Converter={StaticResource SmartAssConverter}}"
并且用于PropertyChanged通知(MVVM Light):
RaisePropertyChanged("Self");
所以,有什么阻止我这样做的原因:
Visibility="{Binding ConverterParameter=!, Converter={StaticResource SmartAssConverter}}"
我测试过,仍然可以正常显示吗?
改写我的问题,是否有必要'改变财产'来迫使这种(恕我直言,丑陋的)构造?
编辑:再次改写,是否有一种更优雅的解决方案来通知绑定的控件其目标已更改,或者我应该研究重新设计Converters?
如果对象(即Self
)发生变化怎么办?使用Self
属性时,可以利用INotifyPropertyChanged接口告知绑定更新。如果删除该属性,那么将如何更新?
您可以尝试执行RaisePropertyChanged(string.Empty)
,但我认为这不起作用。
通常,仅将所需的属性(而不是整个对象)传递给转换器。但是在Silverlight中,没有MultiBinding,因此您只能使用一个属性。
您可以将新属性添加到与转换器执行相同操作的对象,也可以将其包装到另一个添加该属性的对象中。通常,这是视图模型的角色。
您显示的代码看起来有些笨拙,但是我认为它没有那么糟糕,需要重新编写。没错,您可以完全删除路径,这将对绑定进行一次评估。但是,令人担忧的部分是代码对“ Self”进行了属性更改,以便重新评估绑定(很棒的技巧……我会记住以备将来使用!)
这里的[[正确方法是更改DataContext本身,这实际上是对“自身”的更改,并且将导致重新评估所有绑定。
就我个人而言,我不会花太多时间,我看到的更糟!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”属性。