当ItemSource为LINQ时,UWP设置ComboBox的SelectedItem

时间:2017-03-11 23:19:46

标签: c# linq combobox uwp

当基础ItemSource来自LINQ查询时,我在让SelectedItem为ComboBox设置时遇到了一些麻烦。

以下是设置的代码,该方法来自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 个答案:

答案 0 :(得分: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具有不同的实例,只要名称相同,ComboBox就能将其与其他项匹配。