【问题标题】:Behavior of DependencyProperty With Regards to Multiple FrameworkElement InstancesDependencyProperty 关于多个 FrameworkElement 实例的行为
【发布时间】:2013-06-02 12:40:35
【问题描述】:

所以我尝试使用DependencyProperty 来解决我在将本地 ViewModel 传递给子视图方面的问题。然而,一个问题突然出现在我的脑海中。

例如,我需要创建某个FrameworkElement 的多个实例,例如UserControlUserControl 定义了 DependencyProperty。如书中所述,依赖属性实例应该是staticreadonlyDependencyProperty 在这种情况下如何工作?它的工作方式是否与传统的UserControl 属性相同,或者您传递给DependencyProperty 的任何对象实例都会传递给上述UserControl 的所有实例?

【问题讨论】:

    标签: c# wpf dependency-properties frameworkelement


    【解决方案1】:

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

    【讨论】:

    • 非常感谢!我是 WPF 和 MVVM 的新手,这就是为什么我不能完全理解 MSDN 文章中写的内容。你的回答对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2020-07-27
    • 2014-12-31
    • 1970-01-01
    • 2018-03-28
    相关资源
    最近更新 更多