一个如何注册一个依赖属性,其值使用其他依赖项属性的值计算出来的?
由于.NET属性包装用WPF在运行时绕过,不应该包括在getter和setter逻辑。 该解决方案是通常使用PropertyChangedCallback
秒。 但是,这些被声明为static。
例如,什么是完成这一任务做作的正确方法:
public bool TestBool
{
get { return (bool)GetValue(TestBoolProperty); }
set
{
SetValue(TestBoolProperty, value);
TestDouble = ((value)?(100.0):(200.0)); // HERE IS THE DEPENDENCY
}
}
public static readonly DependencyProperty TestBoolProperty =
DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel));
public double TestDouble
{
get { return ((double)GetValue(TestDoubleProperty)); }
set { SetValue(TestDoubleProperty, value); }
}
public static readonly DependencyProperty TestDoubleProperty =
DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel));
只要依赖性不是圆形,有没有做到这一点的适当手段?
嗯...我想你最好看一下依赖属性值强制 。 下面是强制的例子:
public class ViewModel : DependencyObject
{
public bool TestBool
{
get { return (bool)GetValue(TestBoolProperty); }
set { SetValue(TestBoolProperty, value); }
}
public static readonly DependencyProperty TestBoolProperty =
DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel), new PropertyMetadata(false, OnTestBoolPropertyChanged));
private static void OnTestBoolPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var vm = (ViewModel)d;
vm.CoerceValue(TestDoubleProperty);
}
public double TestDouble
{
get { return ((double)GetValue(TestDoubleProperty)); }
set { SetValue(TestDoubleProperty, value); }
}
public static readonly DependencyProperty TestDoubleProperty =
DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel), new PropertyMetadata(0.0, null, OnCoerceTestDouble));
private static object OnCoerceTestDouble(DependencyObject d, object baseValue)
{
var vm = (ViewModel) d;
var testBool = vm.TestBool;
return ((testBool) ? (100.0) : (200.0));
}
}
你实际上是正确的,你应该使用PropertyChangedCallback。 这是如何做:
public bool TestBool
{
get { return (bool)GetValue(TestBoolProperty); }
set
{
SetValue(TestBoolProperty, value);
}
}
public static readonly DependencyProperty TestBoolProperty =
DependencyProperty.Register("TestBool", typeof(bool), typeof(ViewModel),
new PropertyMetadata(false, new PropertyChangedCallback(OnTestBoolChanged)));
private static void OnTestBoolChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ViewModel vm = d as ViewModel;
vm.TestDouble = value ? 100.0 : 200.0;
}
public double TestDouble
{
get { return ((double)GetValue(TestDoubleProperty)); }
set { SetValue(TestDoubleProperty, value); }
}
public static readonly DependencyProperty TestDoubleProperty =
DependencyProperty.Register("TestDouble", typeof(double), typeof(ViewModel));