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
并且在ViewModel中设置了属性Foo
的值
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
的当前值。为什么会这样?
答案 0 :(得分:2)
要将评论转换为答案,
SelectedItem应该是ItemsSource列表中的实际项目,由Equals()方法确定。在你的情况下,它是一个单独的实例,虽然它具有相同的Id,但它不被视为等于。
有几种方法可以解决这个问题,或许可以解决类似问题的方法是覆盖Equals:
public class Foo
{
...
// untested
public override bool Equals(object obj)
{
Foo other = obj as Foo;
return FooId.Equals(other?.FooId);
}
}
但这对您应用的其余部分有影响。当Foo是ViewModel时,我只考虑使用它来解决SelectedItem问题。
另一个解决方案是找到源列表中的实际项目:
public ObservableCollection<Foo> Foos = ...;
public ViewModel()
{
var d = FooService.GetDefaultFoo();
Foo = Foos.FirstOrDefault(f => f.FooId == d.FooId);
}