当项目更改时,WPF组合框不会调用setter方法

时间:2017-01-24 19:01:59

标签: c# wpf combobox

我有一个组合框,它绑定到一个模型中的对象,该模型在我的视图模型中实例化。 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!!!
        };
    }

1 个答案:

答案 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>