web-dev-qa-db-ja.com

データバインドされたWPFComboBoxのデフォルト値を表示する

SelectedValuePathプロパティを使用して、オブジェクトのテキスト以外のものに基づいて選択した値を選択する、データバインドされたWPFcomboxboxがあります。これはおそらく例で最もよく説明されます:

<ComboBox ItemsSource="{Binding Path=Items}"
          DisplayMemberPath="Name"
          SelectedValuePath="Id"
          SelectedValue="{Binding Path=SelectedItemId}"/>

このことのデータコンテキストは次のようになります。

DataContext = new MyDataContext
{
    Items = {
        new DataItem{ Name = "Jim", Id = 1 },
        new DataItem{ Name = "Bob", Id = 2 },
    },
    SelectedItemId = -1,
};

SelectedItemIdが有効なItem.Idと一致する、事前入力されたデータを表示している場合、これはすべてうまくいきます。

問題は、new itemの場合、SelectedItemIdが不明であるということです。 WPFが行うことは、コンボボックスを空白として表示することです。 私はこれを望まない。コンボボックス内の空白のアイテムを禁止したい。リストの最初の項目を表示したいのですが。

これは可能ですか?事前に明示的にSelectedItemIdを設定するコードを書くことはできますが、UIの欠点のため、データモデルを変更する必要はないようです。

22
Orion Edwards

この動作を実現するには、ここでいくつかの手動作業を行う必要があると思います。 SelectedItemIdが一致するかどうかを最初にComboBoxに表示するときにコードビハインドをチェックインし、それに基づいて選択したインデックスを変更できます。または、対応するアイテムがない場合にSelectedItemIdが常に-1になることがわかっている場合は、データトリガーを使用できます。

方法1:

if (!DataContext.Items.Exists(l => l.Id == DataContext.SelectedItemId))
{
    MyComboBox.SelectedIndex = 0;  //this selects the first item in the list
}

方法2:

<Style TargetType="ComboBox">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=SelectedItemId}" Value="-1">
            <Setter Property="SelectedIndex" Value="0"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
10
Ben Collier

このスタイルトリガーを使用できます。selecteditemがnullの場合、最初の要素が選択されます。

<Trigger Property="SelectedItem" Value="{x:Null}">
    <Setter Property="SelectedIndex" Value="0"/>
</Trigger>
5
MBDevelop