我有一个组合框,它绑定到一个模型中的对象,该模型在我的视图模型中实例化。 OnPropertyChange
在继承自INotifyPropertyChange
的Notifier类内部处理。视图模型轮询从数据访问层执行方法,并将可观察列表返回到视图模型。然后将其传递给构造函数,该构造函数构建要绑定到组合框的对象。该对象有两个属性。 1)可观察的可选选项列表和2)表示当前所选项目的字符串。
这是问题所在。组合框已成功绑定并由列表填充。但是,当项目被更改时,它似乎不会调用setter方法。我需要这个功能,所以我可以在项目选出后继续使用应用程序逻辑。调试确认没有调用setter,只调用get。实际上,在模型上调用setter是有意义的。我确定我在这里遗漏了一些东西,我愿意接受更好的方法来做到这一点。
型号
public class WellListGroup : Notifier
{
private ObservableCollection<string> _headers;
public ObservableCollection<string> headers
{
get { return _headers; }
set { _headers = value; OnPropertyChanged("headers"); }
}
private string _selected;
public string selected
{
get { return this._selected;}
set { this._selected = value; OnPropertyChanged("selected");}
}
}
通告
public class Notifier : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
查看模型
public class MainViewModel : Notifier
{
//data access layer
public static getWells gw = new getWells();
//set combo box
public static ObservableCollection<string> headers = gw.getHeaders();
private WellListGroup _wlg = new WellListGroup {headers = headers, selected = headers[0]};
public WellListGroup wlg
{
get {
return _wlg;
}
set {
_wlg = value;
OnPropertyChanged("wlg");
OnChange()// do stuff!!!
}
}
查看
<ComboBox x:Name="groupComboBox"
DockPanel.Dock="Top"
ItemsSource = "{Binding Path = wlg.headers}"
SelectedItem="{Binding Path = wlg.selected, Mode=TwoWay}">
</ComboBox>
编辑 - 重新编写ViewModel以订阅对象上的事件
public class MainViewModel : Notifier
{
//data access layer
public static getWells gw = new getWells();
//set combo box
public static List<string> headers = gw.getHeaders();
private WellListGroup _wlg = new WellListGroup {headers = headers, selected = headers[0]};
public WellListGroup wlg
{
get {
return _wlg;
}
set {
_wlg = value;
OnPropertyChanged("wlg");
OnChange(_wlg.selected);// do stuff!!!
}
}
public MainViewModel()
{
// Move this into the constructor to avoid any race conditions
_wlg = new WellListGroup {headers = headers, selected = headers[0]};
// Subscribe to the property change even for WLG
_wlg.PropertyChanged += (sender, args) =>
{
if (args.PropertyName == "selected") {
}
OnChange(_wlg.selected);// do stuff!!!
};
}
答案 0 :(得分:1)
情况是反射属性设置器在<{strong>} _wlg
类中,而不是VM上_wlg类本身的设置器。 有界项目不是最高级别,而是提到的较低属性。
使用命令系统启动OnChange()// do stuff!!!
代码或订阅_wlg
类实例INotifyProptertyChanged
事件并调用您提到的方法。
无论如何都要处理视图模型中的任何一个?
是,订阅类WellListGroup
属性更改事件的实例,并查找selected
或其他人报告更改。
public MainViewModel()
{
// Move this into the constructor to avoid any race conditions
_wlg = new WellListGroup {headers = headers, selected = headers[0]};
// Subscribe to the property change even for WLG
_wlg.PropertyChanged += (sender, args) =>
{
if (args.PropertyName == 'selected')
OnChange()// do stuff!!!
};
}
值得注意的是,目前还不清楚你是否真的需要在ObservableCollection
中保留字符串。该集合有自己的通知事件实现,用于添加和删除集合中的项目。
如果VM需要该特定更改信息,那么您将需要订阅ObservableCollection
个事件以进行此类操作,而不是/以及上述示例。
如果不需要这些通知,则不需要在ObservableCollection
中保留字符串,您可以将其更改为List<string>
。