WPF:聚合ListBox上的属性

时间:2009-03-20 13:44:43

标签: c# wpf binding listbox itemscontrol

我有两个ListBox,都使用Extended SelectionMode。第一个的ItemsSource是List,并使用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类型的属性。我想将第一个列表中所有选定项目的词典中的所有项目添加到第二个列表中。

转换器似乎在初始加载时调用,然后在此之后不再调用,我最终得到一个空的第二个列表框。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我猜你的转换器只被调用一次,因为列表框上的SelectedItems不是DependencyProperty,因此不会通知绑定它已更新。

您可能最好在您的codebehind / viewmodel中执行此转换(取决于您遵循的方法)并公开要绑定的第二个列表框的属性。

你可以用我能想到的两种方式中的一种来做到这一点。首先,您可以在第一个列表上侦听 SelectionChanged 并更新第二个列表绑定的属性。或者,您可以在第一个列表绑定的项目上放置 IsSelected 属性,并在任何给定项目更改时更新第二个列表。您可以为ListBoxItem添加此样式以同步数据项和视图之间的 IsSelected 属性:

<Style TargetType="{x:Type ListBoxItem}">
   <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>

我的猜测是,第一个实现起来会不那么困难,尽管它可能无法与您所遵循的任何UI方法完全融合。