2017-06-06 36 views
0

被更新我有其中使用下面的類的對象填充的一個IList如何更新的字符串:當一個IList <>的內容在WPF

public class MenuCheckboxData 
{ 
    public int Id { get; set; } 
    public string Label { get; set; } 
    public bool Checked { get; set; } 
} 

這是與IList

public IList<MenuCheckboxData> MenuOptions 
    { 
     get; 
     set; 
    } = new List<MenuCheckboxData>(); 

該IList通過View中的CheckBoxList進行更新,並根據在運行時對視圖所做的更改進行更新,這很好。 現在有在同一類另一個字符串:

string strFinalOpts=""; 

我想被包含所有的IList元素的ID(由逗號分隔)的strFinalOpts其中選中=真。

如何在IList中的任何對象的Checked屬性從View更新/更改時更新strFinalOpts?

+1

您可以在'MenuCheckboxData'上實現'INotifyPropertyChanged'並訂閱每個項目的'PropertyChanged'事件。 – grek40

+1

勾選'ObservableCollection'的'CollectionChanged'加入/刪除列表中物品的'PropertyChanged'事件添加和刪除時的獎勵點數。 –

+0

嗨布拉德利,TX爲您的建議。但由於我的WPF新手級別,ima很少失去here.ILiist 和strFinalOpts是另一個類的變量,即myViewModel,而MenuCheckboxData是一個不同的類。我有INotifyPropertyChanged在我的ViewModel命名爲「DC_ItemCategory」。當IList (我的視圖模型的一個變量)註冊控件的任何更改時,我在這裏稍微遺失了關於如何讀取/更新DC_ItemCategory中的strFinalOpts(它是getter/setter)它與我的觀點有關。一個小例子會有很大的幫助。 –

回答

0

一個典型的做法是有某種基礎視圖模型類,它提供了INotifyPropertyChanged支持:

public abstract class BaseViewModel : INotifyPropertyChanged, IDataErrorInfo 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void RaisePropertyChangedEvent([CallerMemberName]string prop = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(prop)); 
    } 

    protected bool SetProperty<T>(ref T store, T value, [CallerMemberName]string prop = null) 
    { 
     if (!object.Equals(store, value)) 
     { 
      store = value; 
      RaisePropertyChangedEvent(prop); 
      return true; 
     } 
     return false; 
    } 
} 

,然後實現與變更通知各視圖模型屬性:

public class MenuCheckboxData : BaseViewModel 
{ 
    private int _Id; 
    public int Id 
    { 
     get { return _Id; } 
     set { SetProperty(ref _Id, value); } 
    } 

    private string _Label; 
    public string Label 
    { 
     get { return _Label; } 
     set { SetProperty(ref _Label, value); } 
    } 

    private bool _Checked; 
    public bool Checked 
    { 
     get { return _Checked; } 
     set { SetProperty(ref _Checked, value); } 
    } 
} 

對於項目實際項目不是靜態的集合,請使用ObservableCollection<T>而不是IList<T>。訂閱CollectionChanged以管理每個項目的MenuCheckboxData.PropertyChanged事件訂閱。每當爲屬性Checked引發MenuCheckboxData.PropertyChanged事件時,請重新計算帶有ID的字符串。

public class Container : BaseViewModel 
{ 
    public Container() 
    { 
     _MenuOptions = new ObservableCollection<MenuCheckboxData>(); 
     _MenuOptions.CollectionChanged += MenuOptions_CollectionChanged; 
    } 

    void MenuOptions_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.OldItems != null) 
     { 
      foreach (INotifyPropertyChanged item in e.OldItems) 
      { 
       item.PropertyChanged -= MenuCheckboxData_PropertyChanged; 
      } 
     } 
     if (e.NewItems != null) 
     { 
      foreach (INotifyPropertyChanged item in e.NewItems) 
      { 
       item.PropertyChanged += MenuCheckboxData_PropertyChanged; 
      } 
     } 
    } 

    void MenuCheckboxData_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "Checked") 
     { 
      // re-evaluate joined id list 
      StrFinalOpts = string.Join(",", MenuOptions.Where(x => x.Checked).Select(x => x.Id.ToString())); 
     } 
    } 

    private ObservableCollection<MenuCheckboxData> _MenuOptions; 
    public ObservableCollection<MenuCheckboxData> MenuOptions 
    { 
     get { return _MenuOptions; } 
    } 


    private string _StrFinalOpts = ""; 
    public string StrFinalOpts 
    { 
     get { return _StrFinalOpts; } 
     set { SetProperty(ref _StrFinalOpts, value); } 
    } 
} 
相關問題