WPF ComboBox 与自定义列表绑定:理解绑定层次结构
在 WPF 数据绑定中,DataTemplate 内的子元素继承其父元素的 DataContext。这意味着 DataTemplate 内的 ComboBox 会自动将其 DataContext 设置为 DataTemplate 所表示的底层 ViewModel 对象。
数据绑定问题
在提供的代码示例中,ComboBox 不会更新 SelectedItem/SelectedValue 绑定,因为 DataContext 未正确设置。通过在 MainWindow 的代码隐藏文件中显式设置 DataContext,可以解决此问题。
<code class="language-csharp">public partial class Window1 { public Window1() { InitializeComponent(); DataContext = new MainWindowViewModel(); } }</code>
正确的绑定配置
设置 DataContext 后,ComboBox 的绑定配置应如下所示:
<code class="language-xml"><ComboBox ItemsSource="{Binding Path=PhonebookEntries}" DisplayMemberPath="Name" SelectedValuePath="Name" SelectedValue="{Binding Path=PhonebookEntry}" /></code>
修改:使用 CollectionView 的数据绑定问题
如果对 PhonebookEntries 属性使用 CollectionView,建议使用派生类。这是因为直接使用 CollectionView 会导致效率低下和潜在错误。通过使用派生类,可以在避免已知问题的同时实现高级功能。
在下拉列表内容中使用 ToString()
为了避免潜在的绑定问题,您可以使用 ToString() 代替 DisplayMemberPath 来显示下拉列表内容。ToString() 表示每个项目的字符串表示形式,而 DisplayMemberPath 指定用于选中和显示项目的成员。
<code class="language-xml"><ComboBox ItemsSource="{Binding Path=PhonebookEntries}" SelectedValuePath="Name" SelectedValue="{Binding Path=PhonebookEntry}" /></code>
以上是如何正确地将 WPF ComboBox 绑定到自定义列表并解决 DataContext 问题?的详细内容。更多信息请关注PHP中文网其他相关文章!