2

因此,我尝试使用DependencyProperty它来解决关于跨子视图传递本地 ViewModel 的问题。然而,一个问题突然出现在我的脑海中。

例如,我需要制作某个的多个实例FrameworkElement,比如 a UserControl。那UserControl有一个DependencyProperty定义。如书中所述,依赖属性实例应该是staticand readonlyDependencyProperty在这种情况下如何工作?它会以与常规属性相同的方式工作UserControl,还是您传递给 的任何对象实例DependencyProperty,它都会传递给所述的所有实例UserControl

4

1 回答 1

2

是的,它将作为正常财产运行。如果您需要特定控件的属性,即单个控件的一个属性,则可以仅使用依赖属性。它们将通过类的所有实例传递。但是如果你想在很多控件上使用这个属性,那么应该使用附加的依赖属性,它对某个命名空间内的所有成员都可用。属性,如: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 回答