uwp combobox itemssource显示正确显示,但未在列表中选择了SelectedItem。为什么这样?
XAML:
<ComboBox Name="FooComboBox"
ItemsSource="{x:Bind ViewModel.Foos}"
SelectedItem="{x:Bind ViewModel.Foo,Mode=TwoWay,Converter={StaticResource ChangeTypeConverter}}"/>
ChangeTypeConverter
来自Template10
Foos
和属性Foo
的值在ViewModel
public class ViewModel : ViewModelBase
{
Foo _Foo = default(Foo);
public Foo Foo { get { return _Foo; } set { Set(ref _Foo, value); } }
public ObservableCollection<Foo> Foos = new ObservableCollection<Foo>(FooService.GetFoos());
public ViewModel()
{
Foo = FooService.GetDefaultFoo();
foo看起来像这样
public class Foo
{
public Guid FooId { get; set; } = Guid.NewGuid();
public string FooCode { get; set; }
public override string ToString()
{
return FooCode;
}
}
然而,尽管FooComboBox
正确地呈现了Foos
的列表,但SelectedItem
未设置为属性Foo
的当前值。为什么这样?
将评论变成答案,
由Equals()方法确定,SelectedItem应该是项目源列表中的实际项目。在您的情况下,这是一个单独的实例,尽管它具有相同的ID,但并不相等。
有几种解决此问题的方法,也许可以解决类似问题的方法是超越:
public class Foo
{
...
// untested
public override bool Equals(object obj)
{
Foo other = obj as Foo;
return FooId.Equals(other?.FooId);
}
}
,但这对您的应用程序的其余部分具有影响。我只考虑在FOO为ViewModel时使用它来解决selectionItem问题。
另一个解决方案是在源列表中找到实际项目:
public ObservableCollection<Foo> Foos = ...;
public ViewModel()
{
var d = FooService.GetDefaultFoo();
Foo = Foos.FirstOrDefault(f => f.FooId == d.FooId);
}