簡體   English   中英

ComboBox 不自動選擇初始值

[英]ComboBox not autoselecting initial value

我有一個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; }
}

問題是你在這里創建的新對象

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實例確實會被視為同一個人。

編輯

當您在項目中使用 ViewModels 時,如果您也有一個用於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");
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM