c# - DependencyProperty 对于多个 FrameworkElement 实例的行为

标签 c# wpf dependency-properties frameworkelement

因此,我尝试使用 DependencyProperty 来解决有关在 subview 之间传递本地 ViewModel 的问题。然而我的脑海中突然出现了一个问题。

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

最佳答案

是的,它将像普通属性(property)一样运作。如果您需要特定控件的属性(即单个控件的一个属性),则可以仅使用依赖属性。它们将传递到该类的所有实例。但是,如果您希望在许多控件上使用该属性,则应使用附加依赖属性,该属性可供某个命名空间内的所有成员使用。诸如 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

关于c# - DependencyProperty 对于多个 FrameworkElement 实例的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16963221/

相关文章:

c# - DataTable.Select() 属性 : Giving Index Out of Bound Exception

C# 滚动到列表框的顶部

c# - 如何将 XPS 文件中的每一页转换为 C# 中的图像?

wpf - DependencyProperty 未触发

c# - 在 Silverlight 中添加 UIElementCollection DependencyProperty

c# - WCF 服务故障处理 WS-Discovery Resolve 消息

c# - 使用 C# .NET 中的 XDocument 库删除内部节点,但不删除 xml 中的值

c# - 如何创建同时面向 .NET 2.0 和 .NET Standard 的库?

c# - ObservableCollection<T>.Add 是如何工作的?

wpf - 如果 xaml 调用依赖属性的 SetValue(),则通知