【问题标题】:Display a Default value for a Databound WPF ComboBox显示数据绑定 WPF 组合框的默认值
【发布时间】:2009-12-15 22:30:59
【问题描述】:

我有一个数据绑定的 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 匹配。

问题在于,在 new item 的情况下,SelectedItemId 是未知的。 WPF 所做的是将组合框显示为空白。 我不想要这个。我想禁止组合框中的空白项;我希望它显示列表中的第一项。

这可能吗?我可以编写一些代码来显式地预先设置 SelectedItemId,但由于 UI 中的缺陷而不得不更改我的数据模型似乎并不正确。

【问题讨论】:

    标签: c# wpf data-binding combobox


    【解决方案1】:

    我认为您将不得不在这里做一些手动工作才能获得这种行为。当您第一次显示 ComboBox 时,无论 SelectedItemId 是否匹配,您都可以签入后面的代码,然后根据它更改选定的索引。或者,如果您知道 SelectedItemId 在没有对应项目时始终为 -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 从 List 中的第一项开始,而是它是空白的。
    【解决方案2】:

    您可以使用这种样式触发器:如果 selecteditem 为空, 第一个元素被选中。

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

    【讨论】:

    • 不熟悉触发器但是,如果我们有一个空集合并且我们确实设置了 Value="0" ,我们会崩溃吗?谢谢
    猜你喜欢
    • 2020-05-24
    • 2011-11-27
    • 2011-11-21
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多