“Self”构造在Silverlight / MVVM中是否有用?

时间:2011-08-02 14:53:12

标签: silverlight data-binding mvvm mvvm-light valueconverter

我继承了一个总体上具有可疑代码质量的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}}"

,我测试过,仍然表现得很好?

重新提出我的问题,是否有必要“改变财产改变”迫使这种(恕我直言)丑陋的构造?

编辑:再次改写,是否有一个更优雅的解决方案来通知绑定控件他们的目标已经改变,或者我应该考虑重新转换转换器?

3 个答案:

答案 0 :(得分:2)

如果对象(即Self)发生变化怎么办?使用Self属性时,您可以利用INotifyPropertyChanged接口告知绑定更新。如果删除该属性,那么您将如何更新?

您可以尝试RaisePropertyChanged(string.Empty),但我认为这不起作用。

通常,转换器只会传递它们需要的属性,而不是整个对象。但是在Silverlight中,没有MultiBinding,所以你只能使用一个属性。

您可以向对象添加一个新属性,该属性执行与转换器相同的操作,或者将其与另一个添加该属性的对象一起包装。这通常是视图模型的作用。

答案 1 :(得分:1)

我通常实现IChangeTrackingINotifyPropertyChanged接口,然后在默认构造函数中执行以下操作:

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'的更改,并将导致重新评估所有绑定。

就个人而言,我不会花太多时间,我看到的情况要糟糕得多!