为UWP ComboBox设置SelectedItem

时间:2016-12-11 08:15:55

标签: mvvm uwp uwp-xaml template10

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的当前值。为什么会这样?

1 个答案:

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