将ComboBox
绑定到引用的源:
<ComboBox SelectedValue="{Binding Source.SelectedItem}"
ItemsSource="{Binding Source.Items}"
DisplayMemberPath="Name" />
其中Source
是
SourceType _source;
public SourceType Source
{
get { return _source; }
set { _source = value; OnPropertyChanged(); }
}
和SourceType
是
public class SourceType: INotifyPropertyChanged
{
Item _selectedItem;
public Item SelectedItem
{
get { return _selectedItem; }
set { _selectedItem = value; OnPropertyChanged(); }
}
public IReadOnlyList<Item> Items { get; }
public SourceType(...)
{
Items = new List<Items>(...) // **new** list generated from passed arguments
SelectedItem = Items.First();
}
}
和Item
是
public class Item: INotifyPropertyChanged
{
string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged(); }
}
}
发生以下情况:
Source
永不改变),则有效:ComboBox
显示Items
列表并选择了正确的项目(切换时我可以看到Name
视图); ComboBox
错误:没有选择(但下拉列表已存在且工作正常),切换视图或更改Source
时选择不会保留(例如, 2来源)。似乎ComboBox
在识别SelectedValue
或在ItemsSource
中找到它时遇到一些问题。我无法弄清楚出了什么问题。
调试无法发现任何内容:Items
设置正确,SelectedItem
是来自Items
集合的第一个项,但ComboBox
未显示选择。为什么呢?
答案 0 :(得分:4)
我将使用ObservableCollection而不是List for Items,并使用SelectedItem作为ComboBox,而不是SelectedValue。
阅读这个伟大的答案,了解SelectedItem和SelectedValue之间的差异 Difference between SelectedItem, SelectedValue and SelectedValuePath
答案 1 :(得分:0)
SelectedValue
。
只要SelectedValue
不包含ItemsSource
, SelectedValue
就很有用。如果使用SelectedItem
(根据答案),则绑定将使用null
调用setter,就好像用户可以从列表中选择null
一样。我正在利用这种情况(为了避免使用数据模板和更复杂的ViewModel),所以我必须坚持使用SelectedValue
并且我认为我找到了问题的原因,否则应该工作案例。
我必须首先声明ItemsSource
绑定,然后SelectedValue
秒声明
<ComboBox ItemsSource="{Binding Source.Items}"
SelectedValue="{Binding Source.SelectedItem}"
DisplayMemberPath="Name" />
有效!
听起来像另一个特定于xaml的问题,类似于declare CommandParameter before Command
问题。