为UWP Combobox设置了选定的ITITEM



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);    
}

最新更新