2017-03-11 66 views
0

當底層的ItemSource來自LINQ查詢時,我在獲取SelectedItem爲ComboBox設置時遇到了一些麻煩。當ItemSource是LINQ時UWP設置ComboBox的SelectedItem

下面是它設置的代碼,該方法來自Cortana語音命令。說出這本書的名字可能與書面名稱不同,因爲我必須列出名稱中的數字,例如「first」,而不是「1」。

public void SetBookChapter(string book, int? chapter) 
    { 
     Model.BookVoiceName voice = dataLoader.BookVoiceNames.FirstOrDefault(b => b.VoiceBookName.ToLower() == book.ToLower()); 
     if (voice.TotalChapters >= chapter) 
     { 
      UpdateChapterText = false; 
      cmb_Book.SelectedItem = new BookNames { BookName = voice.ActualBookName }; 
      UpdateChapterText = true; 
      cmb_Chapter.SelectedIndex = chapter.Value - 1; 
     } 
    } 

調試時對線路cmb_Book.SelectedItem = ...不設置也不返回爲什麼,對於cmb_Book底層的ItemSource由這些屬性設置任何錯誤或信息:

public IEnumerable<BookNames> CurrentBooks 
    { 
     get 
     { 
      return from b in dataLoader.Translations[TranslationIndex].Books select new BookNames { BookName = b.BookName }; 
     } 
    } 

    public IEnumerable<BookNames> BooksInFirstTranslation 
    { 
     get 
     { 
      return from b in dataLoader.Translations[0].Books select new BookNames { BookName = b.BookName }; 
     } 
    } 

是否有解決方法,我可以直接使用LINQ查詢來設置SelectedItem?我想可能通過使用IEnumerable的已知類型會有所幫助,但事實並非如此。

回答

1

平等不起作用,因爲您在料品來源和所選料品中創建了BookNames的不同實例。

一個解決辦法可能是覆蓋的BookNames的相等比較:

public class BookNames 
{ 
    public string BookName { get; set; } 

    public override bool Equals(object obj) 
    { 
     var bookNames = obj as BookNames; 

     return bookNames != null && this.BookName.Equals(bookNames.BookName); 
    } 

    public override int GetHashCode() 
    { 
     return this.BookName?.GetHashCode() ?? 0; 
    } 
} 

這樣一來,即使SelectedItem有不同的情況下,組合框就能把它只要匹配其他項目的名稱是相同的。

+0

感謝您的提示,它似乎並沒有採取。我嘗試以下: 'BookNames newBook = cmb_Book.Items.Where(B =>(B作爲BookNames).BookName.ToLower()== book.ToLower())FirstOrDefault()作爲BookNames; cmb_Book.SelectedItem = new BookNames(){BookName = voice.ActualBookName}; cmb_Book.SelectedItem = newBook;' 這兩個都沒有改變SelectedItem。 –

+0

在新創建的BookName和從cmb_Book.Items中拉出現有項目之間的哈希碼也是相同的,所以我想知道它是否是UWP中的組合框問題?除了循環遍歷Items,獲取索引,並設置SelectedIndex(實際上可以工作,但不是最優雅的方法)之外,我不確定是否需要設置它的另一種方法。 –

+0

還需要做的是將IEnumerable 轉換爲ObservableCollection ,然後它能夠​​正確設置SelectedItem。 –

相關問題