2017-03-11 40 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。 –

相关问题