一個典型的做法是有某種基礎視圖模型類,它提供了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); }
}
}
您可以在'MenuCheckboxData'上實現'INotifyPropertyChanged'並訂閱每個項目的'PropertyChanged'事件。 – grek40
勾選'ObservableCollection'的'CollectionChanged'加入/刪除列表中物品的'PropertyChanged'事件添加和刪除時的獎勵點數。 –
嗨布拉德利,TX爲您的建議。但由於我的WPF新手級別,ima很少失去here.ILiist和strFinalOpts是另一個類的變量,即myViewModel,而MenuCheckboxData是一個不同的類。我有INotifyPropertyChanged在我的ViewModel命名爲「DC_ItemCategory」。當IList (我的視圖模型的一個變量)註冊控件的任何更改時,我在這裏稍微遺失了關於如何讀取/更新DC_ItemCategory中的strFinalOpts(它是getter/setter)它與我的觀點有關。一個小例子會有很大的幫助。 –