2

IValueConverter を使用して、コレクションをデータ バインディング用のプロキシ オブジェクトに変換しようとしています。

コンバーターは正常に動作しているように見えますが、問題はコレクションに新しいオブジェクトが追加または削除されたときです。同じことがビューで更新されません..

モデル オブジェクト:

public class A {
   public ObservableCollection<string> Members { get; }
}

コンバータ

public class MemberConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        var collection = new CompositeCollection();
        var a = value as A;

        a.Members.ToList().ForEach(member => {
            collection.Add(new ProxyClass{ A= a, Member= member });
        });

        return collection; 
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        throw new System.NotImplementedException();
    }
}

プロキシ クラス

public class ProxyClass {
    public A A { get; set; }

    public string Member{ get; set; }
 }

XAML:

<DataTemplate DataType="{x:Type my:ProxyClass}">
            <TextBlock Text="{Binding Path=Member}"/>
</DataTemplate>
<HierarchicalDataTemplate DataType="{x:Type A}" ItemsSource="{Binding Converter={StaticResource MemberConverter}}">
            <TextBlock Text ="{Binding}"/>
</HierarchicalDataTemplate>
4

2 に答える 2

2

Binding は、それがバインドされているプロパティのプロパティ変更通知が変更された場合にのみ再評価されます。この場合、ItemsSource は DataContext (A インスタンス自体) にバインドされているため、新しい A インスタンスが与えられない限り再評価されません。ItemsSource に指定された値は、実際にはコンバーター内で作成している別のコレクション インスタンスであるため、コレクションが発生させる変更通知をリッスンするものは何もありません。

1 つのオプションは、ソース コレクション (つまり、コンバーターに渡される値) の CollectionChanged イベントをフックするヘルパー クラスをコンバーターに作成させることです。そのオブジェクトは、ソース コレクションとそれが作成するコレクションの同期を維持する役割を果たします。もう 1 つのオプションは、バインディングを強制的に再評価することです。たとえば、ItemsSource バインディングに「Members」のパスを使用し、コレクションのコンテンツを変更すると、A の「Members」のプロパティ変更通知が発生します。

于 2012-06-12T02:29:13.827 に答える
1

プロパティがINotifyPropertyChangedAを実装していないか、DependencyPropertyであるため、更新されていません

必要に応じて、前のいずれかを実装した後に次を追加できます。

ItemsSource="{Binding Converter={StaticResource MemberConverter}, UpdateSourceTrigger=PropertyChanged}">
于 2012-06-11T05:13:44.853 に答える