WPF:Агрегирование свойств в поле списка
-
21-08-2019 - |
Вопрос
У меня есть два списка, оба используют расширенный режим выбора.ItemsSource первого представляет собой список и использует datatemplate .Я пытаюсь использовать агрегацию некоторого свойства из первого в качестве itemssource для второго.Например:
public class MultiAppPropertyAggregator : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
IList<SomeObject> selectedItems = value as IList<SomeObject>;
Dictionary<string, string> bundles = new Dictionary<string,string>();
foreach(SomeObject myobj in selectedItems) {
foreach(KeyValuePair<string,string> name in myobj.Names) {
selectedItems.Add(name.Key, name.Value);
....
<ListBox x:Name="lstApplication" ItemsSource="{Binding}" SelectionChanged="lstApplication_SelectionChanged" SelectionMode="Extended" />
<ListBox x:Name="lstBundles" ItemsSource="{Binding ElementName=lstApplication,Path=SelectedItems,Mode=OneWay,Converter={StaticResource MultiAppPropertyAggregator}}" ItemTemplate="{StaticResource DictionaryList}" SelectedValuePath="Key" SelectionMode="Extended" />
Таким образом, объекты в первом списке содержат свойство типа Dictionary.Я хочу добавить все элементы в словарях всех выбранных элементов из первого списка во второй список.
Конвертер, похоже, вызывается при начальной загрузке, затем не запускается снова после этого, и в итоге я получаю пустое второе поле списка.Я что-то упускаю?
Решение
Я бы предположил, что ваш конвертер вызывается только один раз, потому что SelectedItems в списке не является DependencyProperty и, следовательно, не будет уведомлять привязку о том, что она обновлена.
Возможно, вам было бы лучше выполнить это преобразование в вашем codebehind / viewmodel (в зависимости от того, какой методологии вы следуете) и предоставить свойство для второго окна списка для привязки.
Вы можете сделать это одним из двух способов, которые я могу придумать.Во-первых, вы можете прослушать Измененный выбор в первом списке и обновите свойство, к которому привязан второй список.Или же вы можете поместить Выбран измените свойство элементов, к которым привязан первый список, и обновите свой второй список, когда это изменится для любого данного элемента.Вы можете добавить этот стиль для ListBoxItem, чтобы синхронизировать Выбран свойство между элементом данных и представлением:
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>
Я предполагаю, что первый вариант будет менее сложным в реализации, хотя он может не полностью соответствовать любой методологии пользовательского интерфейса, которой вы придерживаетесь.