加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:30:05 所属栏目:百科 来源:网络整理
导读:如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 因为WPF在运行时绕过了.NET属性包装器,所以不应该在getter和setter中包含逻辑。解决方案通常是使用PropertyChangedCallbacks。但是这些声明是静态的。 例如,完成这项设计任务的正确方法是什么
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的?

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

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

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));

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

嗯…我想你最好看看依赖属性 value coercion.这是一个强制的例子:
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(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",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));
  }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读