【发布时间】:2016-03-09 16:40:18
【问题描述】:
我使用 MVVM Light 已经有一段时间了 - 它非常有用,几乎总是我添加到新项目中的第一个库!
我想知道开发一个实现 INotifyPropertyChanged 以封装可绑定属性的类会有什么影响(下面的示例)。
public class BindableProperty<T> : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private T mValue;
public T Value
{
get { return mValue; }
set
{
if (!EqualityComparer<T>.Default.Equals(mValue, value))
{
mValue = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}
}
}
}
public BindableProperty(T default_value)
{
mValue = default_value;
}
}
使用这个类,我必须更改我的 Xaml,但我相信我的 ViewModel 可能更具可读性(如下) - 特别是当属性数量增加时。
<TextBox Text="{Binding FirstName.Value, UpdateSourceTrigger=PropertyChanged}"/>
public class MainVM
{
public BindableProperty<string> FirstName { get; private set; }
public BindableProperty<string> LastName { get; private set; }
public MainVM()
{
FirstName = new BindableProperty<string>("");
LastName = new BindableProperty<string>("");
}
}
我知道 MVVM Light 的设计非常灵活、轻巧,并提供完全控制(它做得很好)。我当然可以组合实现,并在更复杂的情况下将上面的 BindableProperty 类用于某些属性和更明确的 ViewModelBase 代码用于其他属性。
我是否遗漏了一些明显的东西?这种设计有哪些我可能不知道的权衡取舍(例如,更改 xaml 绑定、数据验证的影响......)?
【问题讨论】:
-
我可能错过了您想要表达的内容,但我认为您应该做的是实现
dependency property。 -
看看PRISM框架中BindableBase类的实现,它是usage。一种冒险是,您绑定到属性本身,而不是
property.Value。 -
@Batuu - BindableBase 看起来与 mvvm-light ViewModelBase 非常相似。也许这不值得付出努力,但是使用这个样板代码通常会在我的 ViewModel 中为每个属性放置 5 行以使其看起来干净,而不是使用上面的类(在构造函数中授予 1 行)。
-
@HughJones:依赖属性是一个视图关注点和模式,它们不属于 ViewModel
-
@tseng - 好点。不过,我仍然不清楚 OP 想要实现什么。
标签: c# wpf mvvm mvvm-light