组合框未自动选择初始值
本文关键字:选择 组合 | 更新日期: 2023-09-27 17:59:00
我有一个绑定到简单ViewModel
中的人员列表的ComboBox
。SelectedPerson是在ViewModel的构造函数中设置的,但当我运行应用程序时,ComboBox并没有设置其初始值。我做错了什么?
请注意,当MyPerson
类的两个实例具有相同的Id时,它们应该被视为相等
不幸的是,我无法修改MyPerson
来覆盖Equals(它是第三方)。
到目前为止,我看到的唯一选项是使用Adapter模式来包装这个类的实例,并在那里实现一个自定义的Equals方法。
我觉得应该有一种更好的方法,它是WPF原生的,通过某种"匹配"来匹配列表中的项目;键";。在我的例子中,项目列表和所选项目来自不同的来源,这就是为什么它们有一个Id属性作为主键。
我玩过SelectedValue和SelectedValuePath,但都不起作用。
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:Test"
mc:Ignorable="d"
x:Name="Root"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<vm:MainViewModel />
</Window.DataContext>
<ComboBox ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}" SelectedValuePath="Id"
DisplayMemberPath="Name"
SelectedValue="{Binding SelectedPerson}" />
</Window>
这个ViewModel作为DataContext:
public class MainViewModel
{
public MainViewModel()
{
SelectedPerson = new MyPerson { Name = "Mary", Id = 1 };
}
public MyPerson SelectedPerson { get; set; }
public IEnumerable<MyPerson> People { get; } = new List<MyPerson>()
{
new MyPerson() {Name = "Mary", Id = 1 },
new MyPerson() {Name = "John", Id = 2 },
};
}
public class MyPerson
{
public string Name { get; set; }
public int Id { get; set; }
}
问题是您在这里创建的新对象
SelectedPerson = new MyPerson { Name = "Mary", Id = 1 };
与您的列表中不同,因此Equals
方法在所有情况下都会返回False
!
正如其他人已经建议的那样,你必须通过这样做来获得列表中的真实对象:
public MainViewModel(){
SelectedPerson = People.First(x=> x.Name.Equals("Mary")); //Or: x.Id == 1
}
但还有另一种解决方案:您可以覆盖MyPerson
类中的Equals
函数,这样每个具有相同Name
和/或Id
的MyPerson
实例都会被视为同一个人。
编辑
当您在项目中使用ViewModel时,如果MyPerson
类也有一个ViewModel会更好。它将解决您的问题和使您的设计更好!
更改
public MainViewModel()
{
SelectedPerson = new MyPerson { Name = "Mary", Id = 1 };
}
至
public MainViewModel()
{
SelectedPerson = People.ElementAt(0);
}
或者,如果你想按名称:
public MainViewModel()
{
SelectedPerson = People.First(x=> x.Name=="Mary");
}