ComboBox不能自动​​选择初始值

时间:2016-07-28 11:14:37

标签: c# wpf xaml mvvm combobox

我有一个ComboBox绑定到简单ViewModel中的人员列表。 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; }
}

2 个答案:

答案 0 :(得分:1)

问题是你在这里创建的新对象

SelectedPerson = new MyPerson { Name = "Mary", Id = 1 };

心不是&#39;与列表中的相同,因此Equals方法在所有情况下都会返回False

正如其他人已经建议的那样,你必须通过这样做来获得列表中的真实对象:

public MainViewModel(){
   SelectedPerson = People.First(x=> x.Name.Equals("Mary")); //Or: x.Id == 1
}

但还有另一种解决方案:您可以覆盖Equals类中的MyPerson函数,以便每个MyPerson个实例具有相同的Name和/或{ {1}}确实会被视为同一个人。

修改

当你在项目中使用ViewModel时,如果你有一个Id类的ViewModel会更好。它可以解决您的问题让您的设计更好!

答案 1 :(得分:0)

更改

public MainViewModel()
{
    SelectedPerson = new MyPerson { Name = "Mary", Id = 1 };
}

 public MainViewModel()
 {
     SelectedPerson = People.ElementAt(0);
 }

或者如果你想通过名字:

 public MainViewModel()
 {
     SelectedPerson = People.First(x=> x.Name=="Mary");
 }