'Self'构造在Silverlight / MVVM中有用吗?

问题描述 投票:4回答:3

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

silverlight data-binding mvvm mvvm-light valueconverter
3个回答
2
投票

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

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

通常,仅将所需的属性(而不是整个对象)传递给转换器。但是在Silverlight中,没有MultiBinding,因此您只能使用一个属性。

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


1
投票

您显示的代码看起来有些笨拙,但是我认为它没有那么糟糕,需要重新编写。没错,您可以完全删除路径,这将对绑定进行一次评估。但是,令人担忧的部分是代码对“ Self”进行了属性更改,以便重新评估绑定(很棒的技巧……我会记住以备将来使用!)

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

就我个人而言,我不会花太多时间,我看到的更糟!

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”属性。
© www.soinside.com 2019 - 2024. All rights reserved.