起因是在用WPF做一个小玩意儿的时候,发现界面上的ComboBox选择项死活绑定不到后台ViewModel中的数据,但是很奇怪的是按钮事件和属性都可以成功绑定,没道理一个IList集合绑定不成功;一顿猛抠头皮,问题最后定位到属性的定义上;
直接看源码:
private string _selectedDeviceName;
/// <summary>
/// 选中的设备名
/// </summary>
public string SelectedDeviceName
{
get => _selectedDeviceName;
set => SetProperty(_selectedDeviceName, value, DeviceSelectionChanged);
}
public IList<string> DeviceList => new ObservableCollection<string>();
public ICommand EndCaptureCommand => new Lazy<RelayCommand>(() =>
new RelayCommand(EndCapture)).Value;
原因是就是在 语法糖 => 的使用,反编译出来的代码起始等于:
public IList<string> DeviceList
{
get
{
return new ObservableCollection<string>();
}
}
明白问题了吧,每一次使用DeviceList属性的时候,都会创建一个新的ObserVableCollection集合,所以在界面上绑定的集合跟在后台初始化的并不是同一个,所以我在后台库库插入数据,界面上一个显示的都没有;
应该修改为:
public IList<string> DeviceList { get; } = new ObservableCollection<string>();