WPF:在列表框聚集性能
-
21-08-2019 - |
题
我有两个列表框,都使用扩展的SelectionMode。第一的的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" />
因此,在第一列表中的对象包含类型字典的属性。我想在第一列表中添加在所有选定项的字典的所有项目的第二列表。
在转换器后,似乎在初始加载要被调用,那么不会再次与我结束了一个空的第二列表框。我缺少的东西吗?
解决方案
我猜你是因为转换器上列表框SelectedItems不是一个DependencyProperty,因此才会被调用一次,不会通知绑定,它已经更新了。
您可能会更好做在你的代码隐藏/视图模型这种转换(取决于你遵循的方法上)和暴露的属性为第二个列表框绑定到。
您可以在我能想到的两种方式做到这一点。首先,你可以听的的SelectionChanged 的第一个列表上,并更新第二表绑定到的属性。或者,你可以把第一个列表绑定到一个项目的 IsSelected 的财产并更新你的第二个列表时在任何给定的项目改变。您可以添加此风格ListBoxItem的同步的的 IsSelected 的数据项和视图之间属性:
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>
我的猜测是,第一个将是实施难度较低,虽然它可能不完全与任何用户界面的方法你以下目。
不隶属于 StackOverflow