我有两个列表框,都使用扩展的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>

我的猜测是,第一个将是实施难度较低,虽然它可能不完全与任何用户界面的方法你以下目。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top