2017-09-19 1 views
1

MVVMを学習するアプリケーションを開発しています。私は今問題がありますが、私と同じような場合は見つかりませんでした。WPF ComboBoxItemスタイルは、コンボボックスがフォーカスを取得した後に読み込まれます。

まず私のコード:

  • プロパティ::文字列の名前
  • プロパティ:BOOL IsSelected
私は以下のように構成されている単純なオブジェクトのリストを持っている

<ComboBox Width="100" DisplayMemberPath="Name" ItemsSource="{Binding MyList}"> 
    <ComboBox.Resources> 
    <Style TargetType="ComboBoxItem"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
    </Style> 
    </ComboBox.Resources> 
</ComboBox> 

私はこのオブジェクトリストを私のComboBoxにバインドし、IsSelected - 私のオブジェクトのプロパティはIsSelectedに - ComboBoxItemのプロパティ。バインディングは正常に動作し、オブジェクトはComboBoxにあり、項目を選択するとIsSelected - プロパティが更新されます。

ただし、アプリケーションの開始時に、選択した項目が表示されないという問題があります。選択した項目が表示されるように、ComboBoxをクリックする必要があります。私はComboBoxItemのスタイルは、親がフォーカスを取得した後に読み込まれると思う。

解決策はありますか?

+0

問題が確認されました。コンボボックスアイテムのUIは、ポップアップリストが実際に開かれたときにのみ作成されます。オープンする前に、項目に基づくスタイルは効果を持ちません。おそらく 'SelectedItem' /' SelectedValue'を代わりに使用しなければなりません。 – grek40

+0

ありがとう、grek!私は今、IsSelectedが真であるオブジェクトを返す新しいreadonlyプロパティを持っています。そして、私はComboboxのSelectedItemをこの新しいプロパティ(Mode = OneTime)にバインドしました。今は動作します。しかし、これは不必要な追加プロパティが必要な回避策だと私は思う。だから誰かが主な問題を解決するための解決策を見つけることができれば幸いです。 –

+0

私はより多くの回避策を提供することができます...コンボボックスの 'Loaded'イベントのように、オープン、更新、終了:' cb1.IsDropDownOpen = true; cb1.UpdateLayout(); cb1.IsDropDownOpen = false; 'しかし、選択したアイテム/値で作業することは、回避策のほうが少なく、より標準的なアプローチです。 IsSelectedアプローチは、単一選択よりも複数選択シナリオに適しています。 – grek40

答えて

0

あなたが選択する項目のインスタンスにComboBoxSelectedItemプロパティを設定するか、またはバインドする必要があります

<ComboBox Width="100" DisplayMemberPath="Name" ItemsSource="{Binding MyList}" SelectedItem="{Binding Selected}"> 
... 

Selected = MyList.FirstOrDefault(x => x.IsSelected == true); 

これは、あなたがMVVMを使用してComboBoxで項目を選択する方法であります。 ComboBoxItemスタイルは定義しません。

+0

これは私が@ grek40の助けを借りて昨日解決した方法です。しかし、私は "FirstOrDefault" - 非常に良い方法を知らなかった。これありがとう! :) –

関連する問題