Я пытаюсь перенести небольшое прототипное приложение, которое я сделал в WinForms, в WPF. У меня возникли проблемы с combobox в WPF, не меняя значения, когда я выбираю другое значение из раскрывающегося списка. Первоначально я попытался просто скопировать код, который я использовал в моем приложении WinForms, чтобы заполнить выпадающее поле и определить, был ли выбран новый индекс. Это как мой WinForms код выглядел так:Combobox не меняет значение при выборе другого значения
private void cmbDeviceList_SelectedIndexChanged(object sender, EventArgs e)
{
var cmb = (Combobox) sender;
var selectedDevice = cmb.SelectedItem;
var count = cmbDeviceList.Items.Count;
// find all available capture devices and add to drop down
for(var i =0; i<count; i++)
{
if(_deviceList[i].FriendlyName == selectedDevice.ToString())
{
_captureCtrl.VideoDevices[i].Selected = true;
break;
}
}
}
Ранее в коде, я наполнении _deviceList
список и поле со списком (в Form1_Load
быть конкретными), обернув поверх имеющихся устройств и их добавления. Я пробовал такой же подход в WPF и мог только заполнить поле со списком. Когда я выбрал новое значение, по какой-то причине то же точное значение (начальное устройство) отправлялось в код события (cmbCaptureDevices_SelectionChanged
в моем приложении WPF). Я просмотрел несколько учебных пособий в WPF и обнаружил, что, возможно, привязка данных была моей проблемой, и я попробовал это вместо этого. Это мой выпадающий в моем файле XAML:
<ComboBox ItemsSource="{Binding Devices}" Name="cmbCaptureDevices"
IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding CurrentDevice,
Mode=TwoWay}" Se;ectionChanged="cmbCapturedDevices_SelectionChanged" />
Там больше к этому определению XAML, но это все произвольные вещи, как HorizontalAlignment
и этажерки. Мой VideoDevicesViewModel
наследует от INotifyPropertyChanged
, имеет private List<Device> _devices
и private Device _currentDevice
. Конструктор выглядит следующим образом:
public VideoDevicesViewModel()
{
_devices = GetCaptureDevices();
DevicesCollection = new CollectionView(_devices);
}
GetCaptureDevices
просто петля, что я имел в моем WinForms приложение, которое заполняет список со всеми avaialble устройств захвата на текущей машине. У меня есть public CollectionView DevicesCollection { get; private set; }
для получения/настройки устройств в начале приложения. Свойство для моего текущего устройства выглядит следующим образом:
public Device CurrentDevice
{
get { return _currentDevice; }
set
{
if (_currentDevice = value)
{
return;
}
_currentDevice = value;
OnPropertyChanged("CurrentDevice");
}
}
OnPropertyChanged просто вызывает событие PropertyChanged
, если событие не является нулевым. Я новичок в WPF (и довольно новичок в C#, в общем, честно), поэтому я не уверен, что мне не хватает чего-то элементарного или нет. Любая идея относительно того, почему эта функция со списком не меняет значения для меня?
Спасибо за ответ Винсент. На самом деле это опечатка с моей стороны. Мое решение моей проблемы в моем ответе Даррену Янг выше. – Zajn