我在ListView中有一个带有Combobox的DataTemplate,就像这样
<GridViewColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.Dimensions, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
DisplayMemberPath="Description"
SelectedValuePath="Id"
SelectedItem="{Binding DimName}"/>
</DataTemplate>
组合框已正确填充,但它不会根据基础字段(即Dimension.DimName)选择内容。
以下是ListView的声明方式
<ListView
Name="lstCriteria"
ScrollViewer.VerticalScrollBarVisibility="Auto"
Margin="5"
AlternationCount="2"
ItemContainerStyle="{StaticResource CriteriaItemStyle}"
ItemsSource="{Binding Source={StaticResource CriteriaList}}" DockPanel.Dock="Top"
IsSynchronizedWithCurrentItem="True">
如果我用一个TextBlock替换组合框,它确实显示了DimName字段的值,就像这样
<TextBox Text="{Binding DimName}"/>
我错过了什么?
答案 0 :(得分:4)
您的DimName
是否直接来自Dimensions
列表?
默认情况下,如果ComboBox的Items设置为自定义类,它会将SelectedItem
与ItemSource
中的项目进行比较。如果它们不引用内存中完全相同的对象,即使对象的数据相同,也不会与该项匹配。
要解决此问题,您可以在ComboBox上设置SelectedValue
和SelectedValuePath
而不是SelectedItem
,也可以覆盖Equals()
的{{1}}方法}如果对象的数据相等则返回true
修改强>
关于以下评论,DimName
是DimName
个对象吗?如果是这样,那么设置Dimension
应该可以正常工作。如果时间过长,您需要设置SelectedItem
,而不是SelectedValue
。如果是其他内容,您可能需要转换器将其转换为SelectedItem
对象
答案 1 :(得分:0)
正如Rachel建议的那样,我在我的类中添加了一个名为Dimension的新属性,类似于此
public Dimension Dimension
{
get { return _dimension; }
set { _dimension = value; }
}
然后设置SelectedItem =“{Binding Dimension}”,如下所示,
<ComboBox ItemsSource="{Binding DataContext.Dimensions, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
DisplayMemberPath="Description"
SelectedValuePath="Id"
SelectedItem="{Binding Dimension}">
</ComboBox>
我犯的愚蠢错误是, 由于我的组合框正确填充,我希望WPF能够以某种方式将DimName内容与ComboBox中的一个项目自动匹配,这是不可能的。