显示一个数据绑定的WPF ComboBox的默认值

22

我有一个数据绑定的WPF组合框,在其中使用SelectedValuePath属性基于除了对象文本之外的某些内容选择选定的值。最好通过示例来解释这一点:

<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 相匹配,这很好。

问题是,在新项目情况下,SelectedItemId 是未知的。WPF 显示该组合框为空。我不想要这个。我想禁止组合框中的空项;我希望它显示列表中的第一项。

这可能吗?我可以编写一些代码来显式地设置 SelectedItemId,但因为 UI 的缺陷而更改我的数据模型似乎不是正确的做法。

2个回答

10

我认为你需要手动处理一下才能实现这个行为。你可以在代码后台检查ComboBox首次显示时SelectedItemId是否匹配,然后根据情况更改所选索引。或者如果你知道当没有对应项时SelectedItemId始终为-1,那么可以使用数据触发器。

方法 1:

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

方法二:

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

即使绑定模式为OneWayToSource,这是否仍然是必要的?我的意思是,绑定的事物不会影响ComboBox,只有另一种方式。我总是希望ComboBox从列表中的第一项开始,但实际上它是空白的。 - Ingó Vals

5

您可以使用以下样式触发器:如果未选择任何项,则选中第一个元素。

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

1
不熟悉触发器,但如果我们有一个空集合并且设置Value="0",会崩溃吗?谢谢。 - ramnz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接