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

wpf – 逻辑上组合依赖项属性

发布时间:2020-12-13 20:47:39 所属栏目:百科 来源:网络整理
导读:我正在使用C#4.0并创建了一个DependencyObject MyView. 在MyView中,我有两个DependencyProperties,PropA和PropB,两者都是布尔值. 我想要第三个DependencyProperty,PropC,也是一个bool,简单地说,应该总是给我(PropA || PropB). 实现这一目标的最佳方法是什么
我正在使用C#4.0并创建了一个DependencyObject MyView.

在MyView中,我有两个DependencyProperties,PropA和PropB,两者都是布尔值.

我想要第三个DependencyProperty,PropC,也是一个bool,简单地说,应该总是给我(PropA || PropB).

>实现这一目标的最佳方法是什么?
>我也在考虑让PropC成为一个只读的DependencyProperty,但是已经阅读了关于绑定到readonly dp的问题(WPF ReadOnly Dependency Properties using MVVM)

您可以使用PropA和PropB的Dependency Property更改回调来设置PropC的值(不要使用CLR属性包装器作为依赖项属性,因为它们永远不会被保证被调用).

如果你有这三个DP

public static readonly DependencyProperty PropAProperty =
    DependencyProperty.Register("PropA",typeof(bool),typeof(MyView),new PropertyMetadata(false,PropAPropertyChanged));

public static readonly DependencyProperty PropBProperty =
    DependencyProperty.Register("PropB",PropBPropertyChanged));

public static readonly DependencyProperty PropCProperty =
    DependencyProperty.Register("PropC",new PropertyMetadata(false));

public bool PropA
{
    get { return (bool)this.GetValue(PropAProperty); }
    set { this.SetValue(PropAProperty,value); }
}
public bool PropB
{
    get { return (bool)this.GetValue(PropBProperty); }
    set { this.SetValue(PropBProperty,value); }
}
public bool PropC
{
    get { return (bool)this.GetValue(PropCProperty); }
    set { this.SetValue(PropCProperty,value); }
}

你可以像这样使用属性更改回调

private static void PropAPropertyChanged(DependencyObject source,DependencyPropertyChangedEventArgs e)
{
    MyView myView = source as MyView;
    myView.OnPropChanged();
}
private static void PropBPropertyChanged(DependencyObject source,DependencyPropertyChangedEventArgs e)
{
    MyView myView = source as MyView;
    myView.OnPropChanged();
}
public void OnPropChanged()
{
    PropC = PropA || PropB;
}

这样,每次PropA或PropB更改时,您都将始终更新PropC的值

此外,PropC不需要是DP,如果您实现INotifyPropertyChanged,它可以是正常的CLR属性.然后,实现可以看起来像这样

public void OnPropChanged()
{
    OnPropertyChanged("PropC");
}   
public bool PropC
{
    get
    {
        return PropA || PropB;
    }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
    }
}

您还可以使用MultiBinding将PropC绑定到PropA和PropB.如果您想要一个这样的例子,请告诉我

(编辑:李大同)

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

    推荐文章
      热点阅读