2017-03-11 13 views
0

基本ItemSourceがLINQクエリのものである場合、SelectedItemをComboBoxに設定するのに問題があります。ItemSourceがLINQのときにUWPがComboBoxのSelectedItemを設定する

ここにコードが設定されていますが、その方法はCortanaの音声コマンドから入力されています。私が綴る名前の数字のために、 "1"ではなく "first"のように、話したときの本の名前は書かれた本の名前と異なるかもしれません。

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の等値比較上書きすることができます: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; 
    } 
} 

この方法は、コンボボックスには、名前限り、別の項目にそれを一致させることができるようになります同じです。

+0

ヒントをいただきありがとうございます。私は以下を試しました: 'BookNames newBook = cmb_Book.Items.Where(b =>(b BookNames).BookName.ToLower()== book.ToLower())FirstOrDefault()as BookNames; cmb_Book.SelectedItem = new BookNames(){BookName = voice.ActualBookName}; cmb_Book.SelectedItem = newBook; ' どちらもSelectedItemを変更していません。 –

+0

ハッシュコードも新しく作成されたBookNameと同じで、既存のアイテムをcmb_Book.Itemsから引き出しているので、UWPのComboBoxの問題かどうか疑問に思っていますか? Itemを反復処理してインデックスを取得し、SelectedIndex(実際には動作しますが、最もエレガントなアプローチではありません)を設定するループ以外は、別の設定方法がわかりません。 –

+0

また、IEnumerable をObservableCollection に変換してからSelectedItemを適切に設定する必要がありました。 –

関連する問題