C# UWP在ItemSource为LINQ时设置组合框的SelectedItem
当底层ItemSource来自LINQ查询时,我在为组合框设置SelectedItem时遇到一些问题 这是它设置的代码,该方法来自Cortana语音命令。书的书名在口语中可能与书面书名不同,因为书名中的数字我必须拼出来,比如first,而不是1C# 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
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;
}
}