ComboBox не показывает текущее значение назначенного поля внутри ListView - PullRequest
0 голосов
/ 08 августа 2011

У меня есть DataTemplate с комбинированным списком внутри ListView, подобный этому

<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 ]

4 голосов
/ 08 августа 2011

Приходит ли ваш DimName непосредственно из списка Dimensions?

По умолчанию, если для элемента ComboBox задан пользовательский класс, он будет сравнивать SelectedItem с элементом в ItemSource по ссылке.Он не будет соответствовать элементу, если он не ссылается на один и тот же объект в памяти, даже если данные объекта совпадают.

Чтобы обойти это, вы можете либо установить SelectedValue и SelectedValuePath вместо SelectedItem в вашем ComboBox, либо вы можете переписать метод Equals() вашего класса DimName, чтобы он возвращал true, еслиданные объекта равны

Редактировать

Что касается вашего комментария ниже, является ли DimName a Dimension объектом?Если это так, то настройка SelectedItem должна работать нормально.Если это длинный, вам нужно установить SelectedValue, а не SelectedItem.Если это что-то еще, вам может понадобиться конвертер, чтобы преобразовать его в Dimension объект

0 голосов
/ 09 августа 2011

Как предположила Рэйчел, я добавила новое свойство в свой класс под названием Измерение класса Измерение, например:

    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, что невозможно.

...