2012-02-21 2 views
0

Я пытаюсь перенести небольшое прототипное приложение, которое я сделал в 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#, в общем, честно), поэтому я не уверен, что мне не хватает чего-то элементарного или нет. Любая идея относительно того, почему эта функция со списком не меняет значения для меня?

ответ

0

Обнаружил ответ самостоятельно. Неожиданное поведение было результатом использования класса устройства Leadtools. Это компонент COM и, по-видимому, не очень хорошо сочетается с моим приложением. Я честно не понимаю, почему именно это сработало, но я включил класс Device в другой класс и использовал это вместо этого. Как только я использовал класс-оболочку, поле со списком функционировало так, как должно.

0

Попробуйте следующее

if _currentDevice == value ... 
+0

Спасибо за ответ Винсент. На самом деле это опечатка с моей стороны. Мое решение моей проблемы в моем ответе Даррену Янг выше. – Zajn

0

Вы используете оператор присваивания '=' вместо оператора равенства '=='

Изменить

if (_currentDevice = value) 

в

if (_currentDevice == value) 
+0

Спасибо, что ответили, но это на самом деле опечатка. Я исправлю это в вопросе. В любом случае я обнаружил проблему. Класс 'Device', который я использую, есть COM-компонент и по какой-то причине не играл хорошо. Я завернул его в класс обертки и использовал это вместо этого, и комбо-бокс чудесным образом работает. – Zajn