2009-03-20 8 views
2

2つのリストボックスがあり、どちらもExtended SelectionModeを使用します。最初のItemsSourceはListで、データ型を使用します。私は最初のいくつかのプロパティの集約を2番目のアイテムソースとして使用しようとしています。例:WPF:ListBoxでのプロパティの集約

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" /> 

したがって、最初のリストのオブジェクトには辞書型のプロパティが含まれています。私は最初のリストのすべての選択された項目の辞書のすべての項目を2番目のリストに追加したいと思います。

コンバーターは最初の読み込み時に呼び出されたようですが、その後はもう一度読み込まれず、空の2番目のリストボックスになります。何か不足していますか?

答えて

0

リストボックスのSelectedItemsはDependencyPropertyではないため、コンバーターが更新されたことをバインディングに通知しないため、コンバーターが一度呼び出されていると思います。

コードビハインド/ビューモデル(この方法を使用する方法によって異なります)でこの変換を行い、2番目のリストボックスをバインドするプロパティを公開する方がよい場合があります。

これは私が考えることができる2つの方法のいずれかで行うことができます。まず、最初のリストでSelectionChangedを聞き、2番目のリストがバインドされているプロパティを更新します。または、最初のリストがバインドされている項目にIsSelectedプロパティを設定し、指定した項目が変更されたときに2番目のリストを更新することができます。 ListBoxItemは、データ項目とビューの間IsSelectedプロパティを同期するために、このスタイルを追加することができます

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

私の推測では、それは完全に噛み合わないかもしれないが最初のものは、実装が少なく難しいだろうということですどのようなUI手法を採用していても

+0

ありがとう、SelectionChangedイベントをリッスンし、ItemsSourceを毎回設定する最初の方法は、完全に機能します。 – Echilon