当基础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的已知类型会有所帮助,但事实并非如此。
答案 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就能将其与其他项匹配。