C# UWP在ItemSource为LINQ时设置组合框的SelectedItem

C# UWP在ItemSource为LINQ时设置组合框的SelectedItem,c#,linq,combobox,uwp,C#,Linq,Combobox,Uwp,当底层ItemSource来自LINQ查询时,我在为组合框设置SelectedItem时遇到一些问题 这是它设置的代码,该方法来自Cortana语音命令。书的书名在口语中可能与书面书名不同,因为书名中的数字我必须拼出来,比如first,而不是1 public void SetBookChapter(string book, int? chapter) { Model.BookVoiceName voice = dataLoader.BookVoiceNames.F

当底层ItemSource来自LINQ查询时,我在为组合框设置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的已知类型可能会有所帮助,但事实并非如此。

相等不起作用,因为您在项目源和所选项目中创建了不同的书名实例

一种解决方法是覆盖书名的相等比较器:


这样,即使SelectedItem具有不同的实例,只要名称相同,组合框也可以将其与另一个项目匹配。

感谢您的提示,这似乎没有什么效果。我尝试了以下方法:BookNames newBook=cmb_Book.Items.Whereb=>b作为BookNames.BookName.ToLower==Book.ToLower.FirstOrDefault作为BookNames;cmb_Book.SelectedItem=新书名{BookName=voice.ActualBookName};cmb_Book.SelectedItem=newBook;这两个选项都没有改变SelectedItem。新创建的BookName和从cmb_Book.Items中提取现有项目之间的哈希代码也是相同的,所以我想知道这是否是UWP中的组合框问题?我不确定还有什么方法可以设置它,除了循环遍历项目,获取索引,并设置SelectedIndex,这实际上是可行的,但不是最优雅的方法。还需要做的是将IEnumerable转换为ObservableCollection,然后才能正确设置SelectedItem。
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;
    }
}