我正嘗試將我在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#而言,誠實地說新手),所以我不確定是否缺少一些基本的東西。任何想法,爲什麼這個組合框不會改變我的價值觀?
感謝您的答覆文森特。這實際上是我的一個錯字。我對我的問題的解決方案是在我對上面的Darren Young的回覆中。 – Zajn 2012-02-22 01:02:52