2

私は2つのリストボックスを持っています。どちらもExtendedSelectionModeを使用しています。最初のItemsSourceはリストであり、データテンプレートを使用します。最初のプロパティの集計を2番目のアイテムソースとして使用しようとしています。例えば:

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タイプのプロパティが含まれています。最初のリストで選択したすべてのアイテムの辞書にあるすべてのアイテムを2番目のリストに追加したいと思います。

コンバーターは初期ロード時に呼び出されたようですが、その後は呼び出されないため、2番目のリストボックスが空になります。私は何かが足りないのですか?

4

1 に答える 1

0

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

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

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

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

私の推測では、最初のものは実装するのがそれほど難しくないと思いますが、あなたが従っている UI 方法論と完全には一致しないかもしれません.

于 2009-03-20T14:11:30.477 に答える