2012-02-21 194 views
0

我正嘗試將我在WinForms中創建的小型原型應用程序遷移到WPF。當我從下拉菜單中選擇一個不同的值時,我在WPF中的組合框出現了一些問題,無法更改值。最初,我嘗試複製我在WinForms應用程序中使用的代碼來填充組合框,並確定是否選擇了新索引。這是我的WinForms代碼是如何看起來像:當選擇不同的值時,組合框不會更改值

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中嘗試了相同的方法,只能填充組合框。當我選擇一個新值時,出於某種原因,相同的確切值(初始設備)被髮送到事件代碼中(我的WPF應用程序中的cmbCaptureDevices_SelectionChanged)。我四處尋找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

感謝您的答覆文森特。這實際上是我的一個錯字。我對我的問題的解決方案是在我對上面的Darren Young的回覆中。 – Zajn 2012-02-22 01:02:52

0

您正在使用賦值運算符'=',而不是平等的經營者'=='

變化

if (_currentDevice = value) 

if (_currentDevice == value) 
+0

感謝您的回覆,但這實際上是一個錯字。我會在問題中解決這個問題。無論如何,我確實發現了這個問題。我在那裏使用的'Device'類有一個COM組件,並且出於某種原因沒有很好地播放。我把它包裝在一個包裝類中,並用它來代替,而組合框奇蹟般地工作。 – Zajn 2012-02-22 01:01:59

相關問題