У меня есть поле со списком, связанное с объектом из модели, созданной внутри моей модели представления. OnPropertyChange
обрабатывается внутри класса Notifier, который наследуется от INotifyPropertyChange
. Опрос модели представления выполняет метод с уровня доступа к данным и возвращает наблюдаемый список в модель представления. Затем он передается в конструктор, который строит объект, который я хочу связать с полем со списком. Объект имеет два свойства. 1) Наблюдаемый список возможных выборов и 2) строка, представляющая текущий выбранный элемент.WPF Combo box не вызывает метод setter, когда элемент изменен
В этом проблема. Комбинированный номер успешно связан и заполняется списком. Тем не менее, как правило, он не вызывает метод setter при изменении элемента. Мне нужна эта функциональность, поэтому я могу продолжить логику приложения после выбора элемента. Отладка подтверждает, что никакой сеттер не вызван, только get. Однако сеттер называет модель, но имеет смысл. Я уверен, что у меня что-то отсутствует, и я открыт для предложений по лучшему способу сделать это.
Модель
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");}
}
}
Notifier
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>
EDIT - Переработан 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!!!
};
}
'wlg' на самом деле не устанавливается здесь' wlg.selected'. Вы можете переместить его на 'OnChanged()' на выбранную функцию набора или захватить событие SelectionChanged в выпадающем списке. – JaredStroeb
Хорошо, я понимаю, что вы здесь говорите. Есть ли способ обрабатывать любой из них из модели просмотра? – LCaraway
Я так не думаю, что выбрано свойство combobox - это то, что меняется, а не выбранное свойство вашей модели. – Bloodday