Ошибочно связывать 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
. Но это не главное сейчас.