WPF:リストボックスの集計プロパティ
-
21-08-2019 - |
質問
私は2つのリストボックスを持って、両方の拡張のselectionModeを使用しています。最初ののItemsSourceはリストである、とするDataTemplateを使用しています。私は2番目のための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" />
だから、最初のリスト内のオブジェクトは、タイプ辞書のプロパティが含まれています。私は2番目のリストに最初のリストで選択したすべての項目の辞書内のすべての項目を追加したい。
コンバータは、後に続いていないもう一度、最初のロード時に呼び出されるようだと、私は空の第二のリストボックスで終わります。私は何かが足りないのですか?
解決
私はそれを更新したことを結合するのを通知しません、あなたはリストボックスにselectedItemsのはそのため、DependencyPropertyにではなく、ために一度だけ呼び出されているコンバータだと推測すると思います。
あなたは(あなたが従っている方法論に依存する)とに結合する2番目のリストボックスのプロパティを露出させ、あなたの分離コード/のviewmodelで、この変換をやったほうが良いかもしれません。
あなたは、私は考えることができる2つの方法のいずれかでこれを行うことができます。まず、あなたが最初のリストにのSelectionChanged のを聞くと、第二のリストがバインドされたプロパティを更新することができます。それとも、あなたは最初のリストがにバインドされている項目にのIsSelected のプロパティを入れて、それが任意の項目を変更したときに2番目のリストを更新することができます。 ListBoxItemは、データ項目とビューの間で、のIsSelected のプロパティを同期するために、このスタイルを追加することができます:
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}"/>
</Style>
私の推測では、それは完全にあなたがフォローしているものは何でもUIの方法論と噛み合わないかもしれないが最初のものは、実装があまり難しくなるということです。