我在WPF应用程序的ViewModel中有这个简单的例子:
class VM_DiskPartition : DependencyObject
{
// (...) Other properties
public bool IsLowOnSpace
{
get { return (bool)GetValue(IsLowOnSpaceProperty); }
set { SetValue(IsLowOnSpaceProperty, value); }
}
public static readonly DependencyProperty IsLowOnSpaceProperty = DependencyProperty.Register("IsLowOnSpace", typeof(bool), typeof(VM_DiskPartition), new PropertyMetadata(false, OnLowOnSpaceChanged));
private static void OnLowOnSpaceChanged(DependencyObject d, DependencyPropertyChangedEventArgs args)
{
((VM_DiskPartition)d).CoerceValue(BgColorProperty);
}
public Brush BgColor
{
get { return (Brush)GetValue(BgColorProperty); }
set { SetValue(BgColorProperty, value); }
}
public static readonly DependencyProperty BgColorProperty = DependencyProperty.Register("BgColor", typeof(Brush), typeof(VM_DiskPartition), new PropertyMetadata(Brushes.Red, null, Coerce_BgColor));
private static object Coerce_BgColor(DependencyObject d, object baseValue)
{
return UIUtils.GetBgColor(((VM_DiskPartition)d).IsLowOnSpace);
}
}
我希望BgColor属性的默认值由其强制函数自动设置。
有没有更优雅的方法来实现这一点而不是从构造函数中调用CoerceValue(BgColorProperty)
?
原因是我将来可能会有很多这样的属性,并且在构造函数中使用很多CoerceValue()调用看起来不太干净。
在这种情况下,使用转换器可能更好吗?我试图不使用它们而是创建新的ViewModel属性。
答案 0 :(得分:1)
您似乎有些困惑...... DependencyObject
和DependencyProperty
类是UI类。他们不属于视图模型。在视图模型中,我们使用普通的CLR属性和INotifyPropertyChanged
接口来处理属性更改通知。因此,根本不需要在视图模型中使用它们。
如果要在视图模型中设置默认值,只需执行以下操作:
private int number = 5; // <-- default value
public int Number
{
get { return number; }
set { number = value; NotifyPropertyChanged("Number"); }
}
如果您想在视图模型中使用属性值强制,则只需执行以下操作:
public int Number
{
get { return number; }
set { number = Math.Max(0, value); NotifyPropertyChanged("Number"); }
}
更新&gt;&gt;&gt;
再看一下你的代码,我发现它根本不应该在视图模型中。它看起来应该在某些UserControl
后面的代码中。我们将数据放在视图模型中,而不是像<{1}} es那样的 UI元素。如果您想为Brush
设置默认值,正确的方法是您向我们展示的方式:
DependencyProperty
属性强制是为了确保值保持在某些范围内,就像我上面给出的示例一样,确保该值永远不会为负。