【问题标题】:ComboBox items with a binded value具有绑定值的 ComboBox 项
【发布时间】:2021-02-25 09:04:07
【问题描述】:

在我的 WPF 页面中,我想创建一个 ComboBox,其中第一项为空,第二项与属性值绑定,所以我这样做了:

<DataGrid x:Name="grdTmplBit" ColumnWidth="*" Style="{StaticResource DataGridStyle}" EnableColumnVirtualization="True" CanUserSortColumns="true" Margin="4,3,2,7" MaxHeight="930" SelectionMode="Extended" SelectionUnit="FullRow" ItemsSource="{Binding ElementName=ObjectsTree, Path=SelectedItem.InfosView, IsAsync=True}" >
    <DataGrid.Columns>                            
        <DataGridTemplateColumn Width="110" Header="COMM" Visibility="Visibile">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox Width="90" SelectedValue="{Binding Comm.UnitName, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource workModeStyle}" SelectedValuePath="Content">
                        <ComboBoxItem Content="" />
                        <ComboBoxItem Content="{Binding Comm.UnitName}" />
                    </ComboBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns> 
</DataGrid> 

属性UnitName 是string。请考虑ComboBox 在DataGridTemplateColumn 内。基本上第二项总是空的,如果我用TextBox 更改ComboBox,则值会正确显示。有什么帮助吗?

【问题讨论】:

  • 看到 ComboBox 没有其 ItemsSource 属性未绑定至少可以说是奇怪的。
  • 没有ItemSource,因为元素应该直接在xaml中用ComboBoxItem定义
  • 我认为您应该澄清您的问题,您希望用户选择UnitName 或null 吗?
  • 两者,他可以在 UnitName(例如“Foobar”)或 null 之间进行选择。如果我直接将“Foobar”作为 Content 属性的值,它可以工作
  • "请考虑组合框位于 DataGridTemplateColumn 内。" - 请考虑创建minimal reproducible example

标签: wpf xaml combobox


【解决方案1】:

我认为您的问题是您将SelectedValue 绑定到Comm.UnitName,并且您还将第二个ComboBoxItem 内容绑定到此属性。这意味着ComboBox 将以下列方式之一运行:

  • (初始选定值来自Comm.UnitName)> 选定行显示此项目> 您选择空项目> Comm.UnitName 将设置为空string > 结果:ComboBoxItems 均为空(一个设置为空,另一个与Comm.UnitName同步,现在也为空)
  • (初始选择值为第一项,为空)> 选中行显示该项> Comm.UnitName 将设置为空string > 结果:同上。

为了解决这个问题,您可以考虑以下选项之一:

  • 为SelectedValue 创建一个专用属性,这样Comm.UnitName 就不会被覆盖。

  • 为ComboBoxItem 中的值创建一个专用属性。

  • 使用OneTime 模式绑定仅同步初始值(这不适用于所有情况,尤其是如果您将空值保存在Comm.UnitName 中,同样的问题)。

    <ComboBoxItem Content="{Binding Comm.UnitName, Mode=OneTime}" />
    

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多