具有绑定值的 ComboBox 项目
ComboBox items with a binded value
在我的 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
内。基本上第二项总是空的,如果我将 ComboBox
更改为 TextBox
,则值会正确显示。有帮助吗?
我认为您的问题是您将 SelectedValue
绑定到 Comm.UnitName
,并且还将第二个 ComboBoxItem
内容绑定到此 属性。这意味着 ComboBox
将以下列方式之一运行:
- (初始 selected 值来自
Comm.UnitName
) > selected 行显示此项目> 你 select 空项目 > Comm.UnitName
将设置为空 string
> 结果:两个 ComboBoxItem
都为空(一个设置为空,另一个与 Comm.UnitName
同步,现在也为空)
- (初始 selected 值为第一项,空)> selected 行显示此项 >
Comm.UnitName
将设置为空 string
> 结果:同上。
为了解决这个问题,您可以考虑以下选项之一:
为 SelectedValue
创建一个专用的 属性,这样 Comm.UnitName
就不会被覆盖。
为 ComboBoxItem
中的值创建一个专用的 属性。
使用OneTime
模式绑定只同步初始值(这并不适用于所有情况,尤其是如果你在Comm.UnitName
中保存空值,同样问题)。
<ComboBoxItem Content="{Binding Comm.UnitName, Mode=OneTime}" />
在我的 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
内。基本上第二项总是空的,如果我将 ComboBox
更改为 TextBox
,则值会正确显示。有帮助吗?
我认为您的问题是您将 SelectedValue
绑定到 Comm.UnitName
,并且还将第二个 ComboBoxItem
内容绑定到此 属性。这意味着 ComboBox
将以下列方式之一运行:
- (初始 selected 值来自
Comm.UnitName
) > selected 行显示此项目> 你 select 空项目 >Comm.UnitName
将设置为空string
> 结果:两个ComboBoxItem
都为空(一个设置为空,另一个与Comm.UnitName
同步,现在也为空) - (初始 selected 值为第一项,空)> selected 行显示此项 >
Comm.UnitName
将设置为空string
> 结果:同上。
为了解决这个问题,您可以考虑以下选项之一:
为
SelectedValue
创建一个专用的 属性,这样Comm.UnitName
就不会被覆盖。为
ComboBoxItem
中的值创建一个专用的 属性。使用
OneTime
模式绑定只同步初始值(这并不适用于所有情况,尤其是如果你在Comm.UnitName
中保存空值,同样问题)。<ComboBoxItem Content="{Binding Comm.UnitName, Mode=OneTime}" />