ComboBox绑定到引用的(相对的)源
本文关键字:相对 ComboBox 引用 绑定 | 更新日期: 2023-09-27 18:24:20
将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(); }
}
CCD_ 3为
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();
}
}
CCD_ 4为
public class Item: INotifyPropertyChanged
{
string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged(); }
}
}
发生以下情况:
- 仅对一个源(如果
Source
从未更改)有效:ComboBox
显示Items
的列表,并且选择了正确的项目(切换视图时我可以看到它的Name
) - 对于多个项目
ComboBox
错误:没有选择(但下拉列表在那里,工作正常),当切换视图或Source
更改时(例如在两个源之间),选择不会持续
ComboBox
似乎在识别SelectedValue
或在ItemsSource
中找到它方面存在一些问题。我也不知道出了什么问题。
调试没有发现任何东西:Items
设置正确,SelectedItem
是Items
集合中的第一个项目,但ComboBox
未经选择而显示。为什么?
我将使用ObservableCollection而不是List for Items,并使用SelectedItem作为ComboBox,而不是SelectedValue。
阅读这个伟大的答案,了解SelectedItem和SelectedValue之间的差异SelectedItem、SelectedValue和SelectedValuePath 之间的差异
@Giangregorio的回答很好,总体上有效,但现在我记得我最初为什么使用SelectedValue
了。
只要ItemsSource
不包含SelectedValue
,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
问题。