2016-12-11 124 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}}"/> 

ChangeTypeConverter來自Template10

Foos和財產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(); 

一個富設置看起來像這樣

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?也就是說,驗證'Foos.Contains(Foo)== true' –

+0

感謝提示@Henk Holterman。我可以看到'Foo'在'Foo's'中......同樣的'FooId'和'FooCode',但是'Foos.Contains(Foo)'返回'false'。抓住我的腦袋想知道爲什麼這可能是? – Vague

+1

我想GetDefaultFoo()從相同的源(Db)獲取值,然後創建它自己的實例。 –

回答

2

要打開註釋到一個答案,

的的SelectedItem應該是的ItemsSource列表內的實際項目,由equals()方法確定。在你的情況下,它是一個單獨的實例,雖然它具有相同的ID,但它不被認爲是相等的。

有幾種方法來解決這個問題,也許是一個將解決類似問題的道路是重寫等於:

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

這是這個問題的一個了不起的解決方案。 –

相關問題