1

依存関係プロパティが定義されているカスタムコントロールがあり、コントロールはINotifyPropertyChangedインターフェイスを実装しています。

依存関係プロパティは、カスタムオブジェクトのコレクションです。

シナリオ1

Dはリストタイプです。リストにどのような変更を加えても、MainUIでは何も更新されません。これは、WPFがリスト内のオブジェクトの追加と削除を理解していないためです。それは完全に新しい参照を理解するので、これを達成するために、私が使用するコントロールのリストを更新したいときはいつでも

MyProperty = new List();

このアプローチでは、DPコールバックは毎回起動しますが、eventArgs.NewValueは常にゼロのままです(UIのリストを正しく更新します)が、e.NewItems.Countに基づいてプロパティ変更されたコールバックにロジックを記述する必要があるため、この場合は動作しません。e.NewItemsが機能しない理由を教えてください。

シナリオ2

DPはObservableCollection型であるため、DPをバインドするビューモデルのコレクションプロパティです。この場合、プロパティを最初に初期化した後に「new」キーワードを再度使用することはないため、プロパティ変更コールバックはまったく発生しません。UIは更新されますが、プロパティの変更はまだ発生しません。したがって、プロパティ変更コールバックのロジックは実行されません。

それらのいずれかまたは両方をどのように機能させる必要がありますか。

4

2 に答える 2

1

ObservableCollectionアプローチを使用して、そのCollectionChangedイベントをサブスクライブします。
そうすれば、コレクションが変更されるたびに通知を受け取ることができます。

しかし、他のアプローチも同様に機能するはずです。通常のリストを新しいインスタンスに設定するPropertyChangedCallbackと、依存関係プロパティに対してが起動され、オブジェクトを調べることDependencyPropertyChangedEventArgsで新しい値を取得できます。

XAML:

<StackPanel>
    <Button Content="Add to observablecollection" Click="click1" />
    <Button Content="Set list to new instance" Click="click2" />
</StackPanel>

コードビハインド:

public partial class Window1 : Window
{
    public ObservableCollection<string> Strings { get; set; }

    public List<string> StringsList
    {
        get { return (List<string>)GetValue(StringsListProperty); }
        set { SetValue(StringsListProperty, value); }
    }

    public static readonly DependencyProperty StringsListProperty =
        DependencyProperty.Register("StringsList", typeof(List<string>), typeof(Window), new PropertyMetadata(null, StringsListPropertyChanged));

    public Window1()
    {
        InitializeComponent();

        Strings = new ObservableCollection<string>();
        Strings.CollectionChanged += strings_CollectionChanged;

        StringsList = new List<string> { "Test1", "Test2", "Test3", "Test4" };
    }

    void strings_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        //Fires everytime the observablecollection has an item added/removed etc.
        MessageBox.Show(string.Format("ObservableCollection has changed! Count is now {0}", this.Strings.Count.ToString()));

        if (this.Strings.Count == 10)
            Console.WriteLine("Collection contains 10 strings!!");
    }

    private static void StringsListPropertyChanged(DependencyObject e, DependencyPropertyChangedEventArgs args)
    {
        var newCount = ((List<string>)args.NewValue).Count.ToString();
        MessageBox.Show(string.Format("Dependency property has changed! Count is now {0}", newCount));
    }

    private void click1(object sender, RoutedEventArgs e)
    {
        this.Strings.Add("Test1");
    }

    private void click2(object sender, RoutedEventArgs e)
    {
        this.StringsList = new List<string> { "Newitem1", "Newitem2" };
    }
}
于 2012-11-27T19:28:00.180 に答える
0

ObservableCollectionは、INotifyPropertyChangedとINotifyCollectionChangedの両方から継承します。コレクションがいつ変更されたかを知りたい場合は、次のインターフェイスを使用する必要があると思います。

INotifyCollectionChanged

于 2012-11-27T19:26:23.273 に答える