Доступ к комбинированным спискам внутри ListView через C # - PullRequest
0 голосов
/ 15 октября 2019

У меня есть ListView, который содержит 2 столбца. Первый столбец представляет собой простую строку. Шаблон второго установлен на один ComboBox. Количество строк и соответственно комбинированные списки неизвестны.

Мой XAML:

<ListView Grid.Row="0" Name="listView" IsSynchronizedWithCurrentItem="True" SelectionMode="Single" Margin="10" ItemsSource="{Binding ImportColumns}">
            <ListView.Resources>
                <local:ListFilterMultiConverter x:Key="listFilterConverter" />
            </ListView.Resources>

            <ListView.View>
                <GridView AllowsColumnReorder="False">

                    <GridViewColumn Header="File column" DisplayMemberBinding="{Binding FileColumnHeader}"/>

                    <GridViewColumn Header="Worksheet column">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>

                                <ComboBox VerticalAlignment="Center" DataContext="{Binding DataContext,RelativeSource={RelativeSource AncestorType={x:Type ListView}}}" SelectionChanged="ComboBox_SelectionChanged" SelectedIndex="0" >
                                    <ComboBox.ItemsSource>
                                        <MultiBinding Converter="{StaticResource listFilterConverter}">
                                            <Binding Path="ListOfWorksheetColumns.UnselectedWorksheetColumns"/>
                                            <Binding RelativeSource="{RelativeSource Self}"/>
                                        </MultiBinding>
                                    </ComboBox.ItemsSource>
                                </ComboBox>

                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                </GridView>
            </ListView.View>

        </ListView>

Мне нужно знать, что находится в выпадающем списке во втором столбце, чтобы строка в первом столбцеможет быть связан со значением соответствующего ComboBox. Проблема в том, что у меня есть ссылка только на элементы в первом столбце.

Мой класс ImportColumn:

public class ImportColumn : BaseViewModel
{
    public string FileColumnHeader { get; set; }
}

Класс BaseViewModel:

public class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { };
}

1 Ответ

0 голосов
/ 15 октября 2019

Ошибочно связывать DataContext, как вы сделали здесь, потому что этот связанный DataContext будет источником по умолчанию для любой другой привязки в ComboBox. Это мешает, потому что вы хотите иметь возможность привязки к свойствам реального текста данных, который является объектом строки, ImportColumn.

Мы можем исправить это, используя тот же RelativeSource, который вы используете для DataContext внутри вашей мультисвязки, что позволяет нам связывать ComboBox.SelectedItem с FileColumnHeader на ImportColumn для этой строки.

<DataTemplate>
    <ComboBox 
        VerticalAlignment="Center" 
        SelectedItem="{Binding FileColumnHeader}"
        SelectionChanged="ComboBox_SelectionChanged"
        >
        <ComboBox.ItemsSource>
            <MultiBinding Converter="{StaticResource listFilterConverter}">
                <Binding 
                    Path="DataContext.ListOfWorksheetColumns.UnselectedWorksheetColumns"
                    RelativeSource="{RelativeSource AncestorType={x:Type ListView}}"
                    />
                <Binding RelativeSource="{RelativeSource Self}"/>
            </MultiBinding>
        </ComboBox.ItemsSource>
    </ComboBox>
</DataTemplate>

Я узнал в комментариях, что обработчик SelectionChanged используется для других вещей, которые можно и, возможно, следует сделать в MVVM, но это немного усложняет.

Для правильной работы ImportColumn.FileColumnHeader необходимо должным образом вызывать PropertyChanged при изменении его значения. Поскольку у вас ImportColumn наследуется от чего-то, что называется BaseViewModel, я собираюсь предположить, что вы, возможно, пропустили эту деталь для краткости.

Немного не по теме: я уверен, что ваш listFilterConverter должен принимать что-то отличное от ComboBox в качестве второго параметра. Какие бы свойства он не получал от ComboBox, вы должны просто связать эти свойства. Конвертер гораздо сложнее использовать повторно, если потребителю нужно обернуть его параметры в ComboBox. Но это не главное сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...