カスタム リストを使用した WPF ComboBox バインディング: バインディング階層について
WPF データ バインディングでは、DataTemplate 内の子要素は親要素の DataContext を継承します。これは、DataTemplate 内の ComboBox の DataContext が、DataTemplate によって表される基になる ViewModel オブジェクトに自動的に設定されることを意味します。
データ バインディングの問題
提供されたコード例では、DataContext が正しく設定されていないため、ComboBox は SelectedItem/SelectedValue バインディングを更新しません。この問題は、MainWindow の分離コード ファイルで DataContext を明示的に設定することで解決できます。
<code class="language-csharp">public partial class Window1 { public Window1() { InitializeComponent(); DataContext = new MainWindowViewModel(); } }</code>
バインディング構成を修正する
DataContext を設定した後、ComboBox のバインド構成は次のようになります。
<code class="language-xml"><ComboBox ItemsSource="{Binding Path=PhonebookEntries}" DisplayMemberPath="Name" SelectedValuePath="Name" SelectedValue="{Binding Path=PhonebookEntry}" /></code>
修正: CollectionView を使用したデータ バインディングの問題
PhonebookEntries プロパティに CollectionView を使用する場合は、派生クラスを使用することをお勧めします。これは、CollectionView の使用が非効率性と潜在的なエラーに直接つながるためです。派生クラスを使用すると、既知の問題を回避しながら高度な機能を実装できます。
ドロップダウン リストのコンテンツで ToString() を使用する
潜在的なバインディングの問題を回避するには、DisplayMemberPath の代わりに ToString() を使用してドロップダウン コンテンツを表示します。 ToString() は各項目の文字列表現を表し、DisplayMemberPath は項目の選択と表示に使用されるメンバーを指定します。
<code class="language-xml"><ComboBox ItemsSource="{Binding Path=PhonebookEntries}" SelectedValuePath="Name" SelectedValue="{Binding Path=PhonebookEntry}" /></code>
以上がWPF ComboBox をカスタム リストに正しくバインドし、DataContext の問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。