C# 关于多个FrameworkElement实例的DependencyProperty行为

C# 关于多个FrameworkElement实例的DependencyProperty行为,c#,wpf,dependency-properties,frameworkelement,C#,Wpf,Dependency Properties,Frameworkelement,因此,我尝试使用dependencProperty来解决在子视图之间传递本地ViewModel的问题。然而,一个问题突然出现在我的脑海里 例如,我需要为某个FrameworkElement创建多个实例,例如UserControl。UserControl定义了一个dependencProperty。如书中所述,依赖项属性实例应该是静态的和只读的。在这种情况下,dependencProperty将如何工作?它的工作方式是否与传统的UserControl属性相同,或者传递给dependencPrope

因此,我尝试使用
dependencProperty
来解决在子视图之间传递本地ViewModel的问题。然而,一个问题突然出现在我的脑海里


例如,我需要为某个
FrameworkElement
创建多个实例,例如
UserControl
UserControl
定义了一个
dependencProperty
。如书中所述,依赖项属性实例应该是
静态的
只读的
。在这种情况下,
dependencProperty
将如何工作?它的工作方式是否与传统的
UserControl
属性相同,或者传递给
dependencProperty
的任何对象实例相同,它将被传递到所述
UserControl
的所有实例中?

是的,它将作为正常属性运行。如果您需要特定控件的属性,即单个控件的一个属性,则可以仅使用dependency属性。它们将通过类的所有实例传递。但是,如果您希望在许多控件上使用该属性,那么应该使用附加的依赖项属性,该属性将对特定命名空间中的所有成员可用。属性,例如: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));
    }
}
它们还包含有用的回调函数,如OnPropertyChangedCallback、ValidateValueCallback,它们可以放在其他逻辑中

这些属性在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" />

有关更多信息,请参阅:

非常感谢!说到WPF和MVVM,我是个新手,这就是为什么我不能完全理解MSDN文章中写的内容。你的回答对我很有帮助。
<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);
}