2

そこでDependencyProperty、子ビュー間でローカル ViewModel を渡すことに関する問題を解決するために使用してみました。しかし、頭の中に疑問が浮かびました。

たとえば、特定のFrameworkElement、たとえば の複数のインスタンスを作成する必要がありますUserControl。それUserControlにはDependencyProperty定義があります。本で述べられているように、依存関係プロパティのインスタンスは and である必要がstaticありreadonlyます。DependencyPropertyそのようなシナリオではどのように機能しますか? 従来のプロパティと同じように機能しUserControlますか、または に渡すオブジェクト インスタンスは何でもDependencyProperty、前述の のすべてのインスタンスに渡されUserControlますか?

4

1 に答える 1

2

はい、通常のプロパティとして動作します。特定のコントロールのプロパティ、つまり単一のコントロールの 1 つのプロパティが必要な場合は、依存関係プロパティのみを使用できます。それらは、クラスのすべてのインスタンスを通過します。ただし、多くのコントロールでプロパティが必要な場合は、添付された依存関係プロパティを使用する必要があります。これは、特定の名前空間内のすべてのメンバーが利用できます。Canvas.Top、DockPanel.Dock などのプロパティは、 DependencyProperty にアタッチされています。

添付された依存関係プロパティのサンプル:

public class MyDependencyClass : DependencyObject
{
    public static readonly DependencyProperty IsSelectedProperty;

    public static void SetIsSelected(DependencyObject DepObject, Boolean value)
    {
        DepObject.SetValue(IsSelectedProperty, value);
    }

    public static Boolean GetIsSelected(DependencyObject DepObject)
    {
        return (Boolean)DepObject.GetValue(IsSelectedProperty);
    }

    private static bool IsSelectedValid(object Value)
    {
        if (Value.GetType() == typeof(bool))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    static MyDependencyClass()
    {
        FrameworkPropertyMetadata MetaData = new FrameworkPropertyMetadata((Boolean)false);

        IsSelectedProperty = DependencyProperty.RegisterAttached("IsSelected",
                                                            typeof(Boolean),
                                                            typeof(MyDependencyClass),
                                                            MetaData,
                                                            new ValidateValueCallback(IsSelectedValid));
    }
}

これらには、追加のロジックに配置できるOnPropertyChangedCallbackValidateValueCallbackなどの便利なコールバックも含まれています。

これらのプロパティは、XAML でも使用できます。「ローカル」名前空間を追加します。

xmlns:local="clr-namespace:SampleApp"

要素の定義:

<Button Name="Button1" local:MyDependencyClass.IsSelected="True" />
<Button Name="Button2" local:MyDependencyClass.IsSelected="False" />

...

<ListBoxItem Name="Sample" local:MyDependencyClass.IsSelected="True" />

トリガー内のプロパティへのアクセス:

<Trigger Property="local:MyDependencyClass.IsSelected" Value="True">
    <Setter Property="Background" Value="Green" />
</Trigger>

コードで添付された依存関係プロパティを操作します。

if (CurrentButtonName == MyButton.Name)
{
    MyDependencyClass.SetIsSelected(CurrentButton, true);
}
else
{
    MyDependencyClass.SetIsSelected(CurrentButton, false);
}

詳細については、http: //msdn.microsoft.com/en-us/library/ms749011.aspxを参照してください。

于 2013-06-06T15:55:49.130 に答える