2016-12-11 7 views
1

Eine UWP ComboBox ItemsSource wird korrekt angezeigt, aber SelectedItem ist in der Liste nicht ausgewählt. Warum ist das so?Set SelectedItem für UWP ComboBox

Die XAML:

<ComboBox Name="FooComboBox" 
    ItemsSource="{x:Bind ViewModel.Foos}" 
    SelectedItem="{x:Bind ViewModel.Foo,Mode=TwoWay,Converter={StaticResource ChangeTypeConverter}}"/> 

ChangeTypeConverter kommt von Template10

Foos und der Wert der Eigenschaft Foo gesetzt ist in dem Ansichtsmodell

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 wie folgt aussehen

public class Foo 
{ 
    public Guid FooId { get; set; } = Guid.NewGuid(); 
    public string FooCode { get; set; } 

    public override string ToString() 
    { 
     return FooCode; 
    } 
} 

Doch obwohl FooComboBox korrekt die Liste der Foos macht, wird die SelectedItem nicht Foo auf den aktuellen Wert der Eigenschaft festgelegt. Warum ist das so?

+1

Does GetDefaultFoo() eine Instanz zurück, die in Foos eigentlich ist? Dh, verifiziere das 'Foos.Contains (Foo) == true' –

+0

Danke für den Tipp @Henk Holterman. Ich kann sehen, 'Foo' ist in' Foo's' ... gleich 'FooId' und' FooCode', aber 'Foos.Contains (Foo)' gibt 'false' zurück. Ich kratze mich am Kopf und frage mich, warum das so sein könnte? – Vague

+1

Ich vermute, dass GetDefaultFoo() die Werte von der gleichen Quelle (Db) erhält und dann seine eigene Instanz erstellt. –

Antwort

2

Um die Kommentare in eine Antwort zu drehen,

Die SelectedItem sollte ein tatsächliches Element in der Liste Itemssource sein, wie sie durch das Equals() -Methode bestimmt. In Ihrem Fall war es eine separate Instanz und obwohl es die gleiche ID hatte, wurde es nicht als gleich angesehen.

Es gibt mehrere Möglichkeiten, dies zu lösen, vielleicht derjenige, der ähnliche Probleme lösen wird die Straße hinunter außer Kraft zu setzen ist Equals:

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

aber dies hat Auswirkungen auf den Rest Ihrer App. Ich würde nur in Betracht ziehen, dies zu verwenden, um ein SelectedItem-Problem zu lösen, wenn Foo ein ViewModel ist.


Die andere Lösung ist das eigentliche Element in der Quellenliste gehen zu finden:

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

Dies ist eine hervorragende Lösung für dieses Problem. –

Verwandte Themen