2011-05-27 39 views
2

我的問題似乎是「範圍」,但我不確定這是正確的術語。我想通知一個只讀列表,以便在設置自定義對象中的屬性時重新評估自己。我相信它根本不知道它的存在。也許有一個簡單的辦法可以解決這個問題,我想不出來,但是我畫了一個空白。如何在類的屬性中使用INotifyPropertyChanged ..?

我覺得這很難說出來,所以這裏簡化了代碼,並對我期望的事情發表了評論。對象中

屬性在我數據綁定:

private CvarAspectRatios _aspectRatio = new CvarAspectRatios("none", GetRatio()); 
public CvarAspectRatios AspectRatio 
{ 
    get { return _aspectRatio; } 
    set 
    {             // This setter never gets hit since I bind to this 
     if (value != null)       // object's 'Value' property now. 
     { 
      _aspectRatio = value; 
      NotifyPropertyChanged("AspectRatio"); 
      NotifyPropertyChanged("ResolutionList"); // I want to inform ResolutionList 
     }            // that it needs to repopulate based 
    }             // on this property: AspectRatio 
} 

private ResolutionCollection _resolutionList = ResolutionCollection.GetResolutionCollection(); 
public ResolutionCollection ResolutionList 
{ 
    get 
    { 
     ResolutionCollection list = new ResolutionCollection(); 
     if (AspectRatio != null && AspectRatio.Value != null) 
     { 
      foreach (Resolutions res in _resolutionList.Where(i => i.Compatibility == AspectRatio.Value.Compatibility)) 
      { 
       list.Add(res); 
      } 
      return list; 
     } 
     return _resolutionList; 
    } 
} 

CvarAspectRatios類:

public class CVarAspectRatios : INotifyPropertyChanged 
{ 
    private string _defaultValue; 
    public string DefaultValue 
    { 
     get { return _defaultValue; } 
     set { _defaultValue = value; NotifyPropertyChanged("DefaultValue"); } 
    } 

    private AspectRatios _value; 
    public AspectRatios Value 
    { 
     get { return _value; } 
     set 
     { 
      _value = value; 
      NotifyPropertyChanged("Value"); 
      NotifyPropertyChanged("ResolutionList"); // This value gets set, and I'd like for ResolutionList to update 
     }            // but it cannot find ResolutionList. No errors or anything. Just 
    }             // no update. 

    public AspectRatios() { } 

    public AspectRatios(string defaultValue, AspectRatios val) 
    { 
     DefaultValue = defaultValue; 
     Value = val; 
    } 

    // Implementation of INotifyPropertyChanged snipped out here 
} 

你是什麼人想的?如果你想要一個示例應用程序,我可以鞭打一個。

回答

3

由於CVarAspectRatios實現INotifyPropertyChanged,因此您可以讓viewmodel類訂閱AspectRatio的PropertyChanged事件。

public class YourViewModel 
{ 
    public YourViewModel() 
    { 
     AspectRatio.PropertyChanged += AspectRatio_PropertyChanged; 
    } 

    void AspectRatio_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "Value") 
      NotifyPropertyChanged("ResolutionList"); 
    }   
} 

只要記住,如果你丟棄ASPECTRATIO對象(如果該對象引用的變化,而不是隻是對象的值屬性),你應該從丟棄的一個事件退訂。

+0

先生,這是非常簡單,它很好。謝謝! – erodewald 2011-05-27 17:19:40

+0

當我這樣綁定到DataGridView時,我得到一個InvalidOperationException。 'BindingSource不能是它自己的數據源。不要將DataSource和DataMember屬性設置爲引用BindingSource的值。' – mphair 2011-06-23 21:50:47

+0

我不確定您的錯誤是否由上述實現引起,因爲沒有設置任何內容。 – Adrian 2011-06-23 22:28:34

0

如果列表需要根據更改的屬性進行更新,則列表(或列表管理器對象,爲更好地封裝)通常需要訂閱託管該屬性的對象的PropertyChanged事件。如果列表本身就是同一個對象的一個​​屬性,就像在這種情況下一樣,對於屬性的setter來說,調用一個更新列表的方法會更簡單和更精簡。

1

爲什麼不把你的ResolutionList重新填充到一個單獨的私有方法中,該方法從AspectRatios的setter中調用?

+0

我相信這會工作,雖然有點超過公認的答案比較複雜。 – erodewald 2011-05-27 17:21:21

2

要變換隻是將現有的代碼到一些東西,應該工作:

private CvarAspectRatios _aspectRatio; //No field initialization because that would not attach event handler, you could do it though and take care of the handler alone in the ctor 
public CvarAspectRatios AspectRatio 
{ 
    get { return _aspectRatio; } 
    set 
    { 
     if (_aspectRatio != value) // WTH @ "value != null" 
     { 
      _aspectRatio.PropertyChanged -= AspectRatio_PropertyChanged; 
      _aspectRatio = value; 
      _aspectRatio.PropertyChanged += new PropertyChangedEventHandler(AspectRatio_PropertyChanged); 
      NotifyPropertyChanged("AspectRatio"); 
     } 
    } 
} 

void AspectRatio_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "Value") 
    { 
     NotifyPropertyChanged("ResolutionList"); 
    } 
} 
+0

對不起,我重寫了它(應該有複製/粘貼),我不是故意寫出來的!= null,哈!你的答案與其他人的答案基本相同。感謝您的幫助! – erodewald 2011-05-27 17:23:09

+1

嗯,這是一件很平常的事情,並不像我抄襲他/她。我在發佈任何答案之前就已經想到了這一點,但是由於計算機重新啓動,我無法及時得到這個代碼。別客氣。 – 2011-05-27 17:26:08

+1

確實你似乎同時發佈。只是解釋爲什麼它不被接受。 – erodewald 2011-05-27 17:31:14

相關問題