4

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

哪个,我已经测试过,仍然显示得很好?

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

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

4

3 回答 3

2

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

你可以尝试做RaisePropertyChanged(string.Empty),但我认为这行不通。

通常,转换器只会传递他们需要的属性,而不是整个对象。但在 Silverlight 中,没有 MultiBinding,因此您仅限于单个属性。

您可以将新属性添加到执行与转换器相同的操作的对象中,也可以使用添加该属性的另一个对象包装它。这通常是视图模型的角色。

于 2011-08-02T14:57:58.170 回答
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”属性。

于 2011-08-02T15:05:31.617 回答
1

您显示的代码看起来有点笨拙,但我认为它并没有那么糟糕以至于需要重新编写。你是对的,你可以完全删除路径,这将适用于绑定的一次性评估。然而,令人担忧的部分是代码引发“Self”的属性更改以重新评估绑定(伟大的黑客......我会记住以备将来使用!)

此处正确的方法是更改​​ DataContext 本身,这实际上是对“自我”的更改,并将导致重新评估所有绑定。

就个人而言,我不会在这上面花太长时间,我见过更糟糕的!

于 2011-08-02T15:06:42.650 回答