2016-12-11 23 views
1

UWPコンボボックスItemsSourceは正しく表示されますが、SelectedItemはリストで選択されていません。どうしてこんなことに?UWPコンボボックスのSelectedItemの設定

XAML:

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

ChangeTypeConverterTemplate10

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

FooComboBoxFoosのリストを正しくレンダリングしますが、Fooの現在の値にはSelectedItemが設定されていません。どうしてこんなことに?

+1

GetDefaultFooは()FOOSに実際にありますインスタンスを返していますか?つまり、Foos.Contains(Foo)== trueであることを確認してください。 –

+0

ヒント@Henk Holtermanをありがとう。 'Foo'が' Foo's ...と同じFooId'と 'FooCode'になっていますが、' Foos.Contains(Foo) 'は' false'を返します。なぜ頭がおかしくなったのか疑問に思っていますか? – Vague

+1

私はGetDefaultFoo()が同じソース(Db)から値を取得し、それ自身のインスタンスを作成すると思います。 –

答えて

2

に等しい()メソッドによって決定されるように、のItemsSourceリスト内の実際の項目であるべきで、回答に

のSelectedItemのコメントを有効にします。あなたのケースでは、それは別のインスタンスであり、同じIDを持っていましたが、Equalとはみなされませんでした。

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

が、これはあなたのアプリケーションの残りの部分に影響を持っている:

は、これを解決するにはいくつかの方法、おそらく道路をオーバーライドすることでダウン同様の問題を解決します等しい1があります。私はFooがViewModelであるときにこれを使ってSelectedItemの問題を解決することを検討します。


他のソリューションは、ソースリストで実際のアイテムを探しに行くことです。

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

これはこの問題の素晴らしい解決策です。 –

関連する問題