代码之家  ›  专栏  ›  技术社区  ›  Echilon

WPF:聚合列表框上的属性

  •  2
  • Echilon  · 技术社区  · 15 年前

    我有两个列表框,都使用扩展选择模式。第一个的itemssource是一个列表,使用一个数据模板。我正试图使用来自第一个属性的聚合作为第二个属性的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 回复  |  直到 15 年前
        1
  •  0
  •   dustyburwell    15 年前

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

    您最好在codebehind/viewmodel中进行这种转换(取决于您遵循的方法),并为要绑定到的第二个列表框公开属性。

    你可以用我能想到的两种方法中的一种来做这个。首先,你可以听 选择已更改 并更新第二个列表绑定到的属性。或者,您可以将 被选择的 属性,并在第一个列表绑定到的项发生更改时更新第二个列表。您可以为ListBoxItem添加此样式以同步 被选择的 数据项和视图之间的属性:

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

    我的猜测是,第一个方法不太难实现,尽管它可能不完全符合您所遵循的任何UI方法。