2016-12-11 10 views
1

Элементы UWP ComboBox ItemsSource отображаются правильно, но SelectedItem не выбран в списке. Почему это так?Set SelectedItem для UWP ComboBox

Часть 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(); 

A 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

ли GetDefaultFoo() возвращает экземпляр который на самом деле в Фоосе? Т.е., убедитесь, что 'Foos.Contains (Foo) == true' –

+0

Спасибо за отзыв @Henk Holterman. Я могу видеть, что 'Foo' находится в' Foo's' ... том же 'FooId' и' FooCode', однако 'Foos.Contains (Foo)' возвращает 'false'. Поцарапать мою голову, интересно, почему это может быть? – Vague

+1

Я полагаю, что GetDefaultFoo() получает значения из одного источника (Db), а затем создает собственный экземпляр. –

ответ

2

Чтобы включить комментарии в ответ,

SelectedItem должен быть фактический элемент внутри списка ItemsSource, как определено Равных() метод. В вашем случае это был отдельный экземпляр, и хотя он имел тот же ИД, он не считался равным.

Есть несколько способов решить эту проблему, возможно, тот, который будет решать подобные проблемы вниз по дороге, чтобы переопределить Equals:

public class Foo 
{ 
    ... 
    // untested 
    public override bool Equals(object obj) 
    { 
     Foo other = obj as Foo; 
     return FooId.Equals(other?.FooId); 
    } 
} 

, но это имеет последствия для остальной части вашего приложения. Я бы рассматривал это только для решения проблемы SelectedItem, когда Foo является ViewModel.


Другое решение пойти найти фактический элемент в списке источников:

public ObservableCollection<Foo> Foos = ...; 
public ViewModel() 
{ 
    var d = FooService.GetDefaultFoo(); 
    Foo = Foos.FirstOrDefault(f => f.FooId == d.FooId);  
} 
+0

Это потрясающее решение этой проблемы. –

Смежные вопросы