簡體   English   中英

如何使用INotifyPropertyChanged更新派生的屬性

[英]How to update the derived properties using INotifyPropertyChanged

我在XtratreeList(DevExress)的bindingList中有一些屬性,其中子節點需要顯示parentnode'e屬性。 我有以下代碼。

public abstract class ClassBase : INotifyPropertyChanged
{
    protected static int initialId = 0;

    private int id;
    private int parentID;
    private string productName;
    private string productType;
    private string colorProductType;

    private void RaisePropertyChanged(string propertyName)
    {
        if ( PropertyChanged != null )
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public int ID
    {
        get { return id; }
        set
        {
            if ( id == value )
                return;

            id = value;
            RaisePropertyChanged("ID");
        }
    }

    public int ParentID
    {
        get { return parentID; }
        set
        {
            if ( parentID == value )
                return;

            parentID = value;
            RaisePropertyChanged("ParentID");
        }
    }

    public string ProductName
    {
        get { return productName; }
        set
        {
            if ( productName == value )
                return;

            productName = value;
            RaisePropertyChanged("ProductName");
        }
    }

    public string ProductType
    {
        get { return productType; }
        set
        {
            if ( productType == value )
                return;

            productType = value;
            RaisePropertyChanged("ProductType");
            RaisePropertyChanged("ColorProductType");
        }
    }

    public string ColorProductType
    {
        get { return colorProductType ; }
        set
        {
            if (colorProductType == value)
                return;

            colorProductType = value;
            RaisePropertyChanged("ColorProductType");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}`

我的要求是在ProductType屬性更改時更改ColorProductType屬性,基本上ProductType是父節點屬性,而ColorProductType是子節點屬性。 因此,在更改父母的財產時,需要更改孩子的財產。 我將這兩個屬性都綁定到2個文本框。 因此,更改父屬性應同時更改兩個文本框,但反之亦然。 RaisePropertyChanged("ColorProductType"); 在父級中不起作用, colorproducttype為null,這是什么問題?

RaisePropertyChanged實際上並不更新該屬性。 它只是發出PropertyChanged事件的信號。 某處必須訂閱它並相應地更新其他屬性。 像這樣:

public abstract class ClassBase : INotifyPropertyChanged
{
    private string productType;
    private string colorProductType;

    public ClassBase()
    {
        this.PropertyChanged += HandlePropertyChanged;
    }

    private void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if(e.PropertyName == "ProductType")
        {
            // update ColorProductType here
        }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        if ( PropertyChanged != null )
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    public string ProductType
    {
        get { return productType; }
        set
        {
            if ( productType == value )
                return;

            productType = value;
            RaisePropertyChanged("ProductType");
        }
    }

    public string ColorProductType
    {
        get { return colorProductType ; }
        set
        {
            if (colorProductType == value)
                return;

            colorProductType = value;
            RaisePropertyChanged("ColorProductType");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

自然,這完全是矯over過正。 您可以在更新ProductType時更新ColorProductType ,並讓PropertyChanged事件和數據綁定處理文本框更新:

public string ProductType
{
    get { return productType; }
    set
    {
        if ( productType == value )
            return;

        productType = value;

        // update ColorProductType here

        RaisePropertyChanged("ProductType");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM