1

親ユーザーコントロールにデータバインドされる依存関係プロパティをWPFユーザーコントロールに作成しました。INotifyPropertyChanged値が変更されたときに通知を送信するために、ビューモデルにを実装しました。

ユーザー制御コード:

public bool IsVisibile {
get { return (bool) GetValue(IsVisibileProperty); }
set { SetValue(IsVisibileProperty, value); }}

public static readonly DependencyProperty IsVisibileProperty =
        DependencyProperty.Register("IsVisibile", typeof(bool), typeof(UserControl),
                                    new PropertyMetadata(default(bool), VisiblePropertyChangedCallback));

    private static void VisiblePropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        if (dependencyPropertyChangedEventArgs.NewValue != null)
        {
            ((UserControl) dependencyObject).IsVisibile = (bool) dependencyPropertyChangedEventArgs.NewValue;
        }

    }

親ユーザー コントロールの使用法:

<uc:UserControl IsVisible="{Binding IsViewModelVisible, UpdateSourceTrigger=PropertyChanged}"

「IsViewModelVisible」が変更された場合、プロパティ変更イベント ハンドラは呼び出されず、プロパティは更新されません。

何かご意見は?

4

2 に答える 2

1

IsVisibilePropertyChangedCallback では、プロパティが変更されたときに通知を受け取ります。今度は同じプロパティをもう一度設定しますが、それは無意味です。

さらに悪いことに、プロパティを設定するとバインディングが効果的に削除されます。したがって、バインディング ソース プロパティのその後の変更については通知されません。

コールバックでプロパティを再度設定しないでください。プロパティが変更されたときに何が起こるかを行うだけです。コントロールのVisibility.

于 2013-03-06T18:45:08.760 に答える
0

コードは正しいと思います。DP が発生しない唯一の原因は、typeof(UserControl)代わりに を使用する必要があることtypeof(YourControlType)です。これをテストして、私にフィードバックしてください。希望は役に立ちます...


編集

はい、クレメンスは正しいです。設定する必要があるVisibilityプロパティはプロパティです。また、値コンバーター、BoolToVisibilityConverter をインスタンスに使用することもできます。

于 2013-03-06T18:47:59.357 に答える