ComboBox不显示ListView中指定字段的当前值

时间:2011-08-08 18:59:31

标签: wpf data-binding listview combobox selecteditem

我在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}"/>

我错过了什么?

2 个答案:

答案 0 :(得分:4)

您的DimName是否直接来自Dimensions列表?

默认情况下,如果ComboBox的Items设置为自定义类,它会将SelectedItemItemSource中的项目进行比较。如果它们不引用内存中完全相同的对象,即使对象的数据相同,也不会与该项匹配。

要解决此问题,您可以在ComboBox上设置SelectedValueSelectedValuePath而不是SelectedItem,也可以覆盖Equals()的{​​{1}}方法}如果对象的数据相等则返回true

修改

关于以下评论,DimNameDimName个对象吗?如果是这样,那么设置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中的一个项目自动匹配,这是不可能的。