wpf – 依赖属性依赖于另一个

前端之家收集整理的这篇文章主要介绍了wpf – 依赖属性依赖于另一个前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的?

因为WPF在运行时绕过了.NET属性包装器,所以不应该在getter和setter中包含逻辑。解决方案通常是使用PropertyChangedCallbacks。但是这些声明是静态的。

例如,完成这项设计任务的正确方法是什么?

  1. public bool TestBool
  2. {
  3. get { return (bool)GetValue(TestBoolProperty); }
  4. set
  5. {
  6. SetValue(TestBoolProperty,value);
  7. TestDouble = ((value)?(100.0):(200.0)); // HERE IS THE DEPENDENCY
  8. }
  9. }
  10. public static readonly DependencyProperty TestBoolProperty =
  11. DependencyProperty.Register("TestBool",typeof(bool),typeof(viewmodel));
  12.  
  13. public double TestDouble
  14. {
  15. get { return ((double)GetValue(TestDoubleProperty)); }
  16. set { SetValue(TestDoubleProperty,value); }
  17. }
  18. public static readonly DependencyProperty TestDoubleProperty =
  19. DependencyProperty.Register("TestDouble",typeof(double),typeof(viewmodel));

只要依赖不是循环的,是否有适当的方法来完成这个?

嗯…我想你最好看看依赖属性 value coercion.这是一个强制的例子:
  1. public class viewmodel : DependencyObject
  2. {
  3. public bool TestBool
  4. {
  5. get { return (bool)GetValue(TestBoolProperty); }
  6. set { SetValue(TestBoolProperty,value); }
  7. }
  8. public static readonly DependencyProperty TestBoolProperty =
  9. DependencyProperty.Register("TestBool",typeof(viewmodel),new PropertyMetadata(false,OnTestBoolPropertyChanged));
  10.  
  11. private static void OnTestBoolPropertyChanged(DependencyObject d,DependencyPropertyChangedEventArgs e)
  12. {
  13. var vm = (viewmodel)d;
  14. vm.CoerceValue(TestDoubleProperty);
  15. }
  16.  
  17. public double TestDouble
  18. {
  19. get { return ((double)GetValue(TestDoubleProperty)); }
  20. set { SetValue(TestDoubleProperty,value); }
  21. }
  22. public static readonly DependencyProperty TestDoubleProperty =
  23. DependencyProperty.Register("TestDouble",new PropertyMetadata(0.0,null,OnCoerceTestDouble));
  24.  
  25. private static object OnCoerceTestDouble(DependencyObject d,object baseValue)
  26. {
  27. var vm = (viewmodel) d;
  28. var testBool = vm.TestBool;
  29. return ((testBool) ? (100.0) : (200.0));
  30. }
  31. }

猜你在找的设计模式相关文章