6

コントロールのプロパティを XAML で変更できるように、DependencyProperties を使用して簡単な UserControl の例を作成しています (以下のコード)。

しかし、もちろん、私のアプリケーションでは、このコントロールに密結合のコード ビハインドを持たせたくありません。代わりに、ユーザー コントロールは "DataTypeWholeNumberView" というビューになり、"DataTypeWholeNumberViewModel" という独自の ViewModel を持ちます。

したがって、以下の DependencyProperty ロジックを ViewModel に実装しますが、ViewModel では通常 INotifyPropertyChanged を継承します。これにより、同じ機能が得られるようです。

では、次の関係はどのようなものですか。

  1. UserControl XAML の DataContext をDependencyProperties を持つそのコード ビハインドにバインドする
  2. UserControl XAML (View) の DataContext をそのViewModel (INotifyPropertyChanged から継承) にバインドし、INotifyPropertyChanged 機能を実装するプロパティを持っていますか?

XAML:

<UserControl x:Class="TestDependencyProperty827.SmartForm.DataTypeWholeNumber"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal">
            <TextBlock Text="{Binding Label}"/>
        </StackPanel>
    </StackPanel>
</UserControl>

コードビハインド:

using System.Windows;
using System.Windows.Controls;

namespace TestDependencyProperty827.SmartForm
{
    public partial class DataTypeWholeNumber : UserControl
    {
        public DataTypeWholeNumber()
        {
            InitializeComponent();
            DataContext = this;
        }

        public string Label
        {
            get
            {
                return (string)GetValue(LabelProperty);
            }
            set
            {
                SetValue(LabelProperty, value);
            }
        }

        public static readonly DependencyProperty LabelProperty =
            DependencyProperty.Register("Label", typeof(string), typeof(DataTypeWholeNumber),
            new FrameworkPropertyMetadata());
    }
}
4

3 に答える 3

9

INotifyPropertyChanged は、.Net 2.0 以降に存在するインターフェイスです。基本的に、プロパティが変更されたときにオブジェクトが通知できるようにします。このイベントが発生すると、関係者は特定のアクションを実行できます。問題は、プロパティの名前のみを公開することです。したがって、ハンドラーで何をすべきかを理解するために、リフレクションまたはいくつかの疑わしい if ステートメントを使用することになります。

DependencyProperties は、既定値をサポートするより精巧な構造であり、よりメモリ効率が高くパフォーマンスの高い方法で通知を変更します。

唯一の関係は、WPF バインディング モデルが INotifyPropertyChanged 実装を使用して、DependencyProperties または標準の Clr プロパティへのバインディングをサポートすることです。ViewModel も DependecyObject である可能性があり、3 番目のオプションは、ViewModel の DependencyProperties にバインドすることです!

Kent Boogaart は、ViewModel を POCO にするか DependencyObject にするかについて、非常に興味深い記事を書きました。

于 2009-05-20T13:28:39.547 に答える
2

DependencyPropertiesとINotifyPropertyChangedの間に関係があるとは思いません。ここでの唯一の魔法は、Bindingクラス/ユーティリティがDependencyPropertyを認識して直接バインドするか、binding-targetのnotify-property-changedイベントをサブスクライブしてそれが発生するのを待つのに十分賢いことです。

于 2009-05-20T13:22:54.770 に答える
0

WPFを使用すると、DependencyPropertiesまたはINotifyPropertyChangedを実装するプロパティのいずれかにバインドできます。それは選択の問題です。

したがって、質問は、コードビハインドまたはビューモデルのいずれかに分割されます。密結合のコードを背後に配置したくないと述べたので、MVVMパターンに従ったビューモデルを使用することをお勧めします。

コードビハインドで行ったのと同じように、ビューモデルでもDependencyPropertiesを使用できます。

于 2012-03-21T10:23:12.090 に答える