[英]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.