DependencyProperty默认值取决于强制逻辑

时间:2014-02-20 18:02:04

标签: c# wpf mvvm

我在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属性。

1 个答案:

答案 0 :(得分:1)

您似乎有些困惑...... DependencyObjectDependencyProperty类是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

属性强制是为了确保值保持在某些范围内,就像我上面给出的示例一样,确保该值永远不会为负。