WPF中的依赖属性

时间:2012-12-10 13:47:56

标签: c# wpf dependencies

我正在为我的Avalon底座控制器DependencyProperty工作。这是我目前正在处理的一些示例代码。

要求是:在一个单独的类中创建所有依赖项属性,并在View中访问该属性。这样的事情。

<Button isPaneVisible="true"> or <Button isPaneVisible="{Staticresource path=name, Mode=twoway">

你能帮我解决一下这个问题吗?

namespace Avatar.UI.ViewModel
{
    internal class DependencyPropertyClass : DependencyObject
    {
        public static readonly DependencyProperty IsPaneVisibleProperty =
            DependencyProperty.RegisterAttached("IsPaneVisible", typeof(bool), typeof(DependencyPropertyClass),
                new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsPaneVisible_PropertyChanged));

        private static void IsPaneVisible_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
        }

        /// <summary>
        /// Sets the IsPaneVisible for an element.
        /// </summary>
        public bool IsPaneVisible
        {
            get { return (bool)GetValue(IsPaneVisibleProperty); }
            set
            {
                SetValue(IsPaneVisibleProperty, value);
            }
        }

    }
}

<UserControl x:Class="Avatar.UI.View.ContentView"             
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"    
             mc:Ignorable="d" 
             xmlns:avalonDock="http://avalondock.codeplex.com"     
             xmlns:local="clr-namespace:Avatar.UI.ViewModel"             
             d:DesignHeight="300" d:DesignWidth="300">


<Button IsPaneVisible="true"></Button 

</UserControl>

3 个答案:

答案 0 :(得分:3)

定义附加依赖项属性还需要定义静态get和set访问器方法。有关详细信息,请参阅Custom Attached Properties。另请注意,您的类不一定需要从DependencyObject派生,只要它只定义附加属性即可。但是在 public 类中定义这些属性总是一个好主意。

public class DependencyPropertyClass
{
    public static readonly DependencyProperty IsPaneVisibleProperty =
        DependencyProperty.RegisterAttached("IsPaneVisible", typeof(bool), typeof(DependencyPropertyClass),
            new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, IsPaneVisible_PropertyChanged));

    private static void IsPaneVisible_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
    }

    public static bool GetIsPaneVisible(DependencyObject obj)
    {
        return (bool)obj.GetValue(IsPaneVisibleProperty);
    }

    public static void SetIsPaneVisible(DependencyObject obj, bool value)
    {
        obj.SetValue(IsPaneVisibleProperty, value);
    }
}

正如Cyborgx37指出的那样,你会在XAML中使用附加属性,如下所示:

<Button local:DependencyPropertyClass.IsPaneVisible="True" />

答案 1 :(得分:1)

我可能错了,但我认为你正在寻找这个:

<Button local:DependencyPropertyClass.IsPaneVisible="true"></Button>

您必须指定命名空间,因为IsPaneVisible不是“http://schemas.microsoft.com/winfx/2006/xaml/presentation”命名空间的一部分。

请参阅:Attached Properties Overview

修改
我已经有一段时间了,所以当我扫描你的代码时,事情正在慢慢回复给我。对于附加属性,您不能使用实例属性来获取/设置属性。您必须创建静态Get<PropertyName>Set<PropertyName>函数:

public static void SetIsPaneVisible(DependenyObject target, Boolean value)
{
    target.SetValue(IsPaneVisibleProperty, value);
}
public static bool GetIsPaneVisible(DependenyObject target)
{
    return (bool)target.GetValue(IsPaneVisibleProperty);
}

说真的......请阅读链接的文章。这一切都在那里解释。

答案 2 :(得分:0)

依赖项属性应该派生您要为其创建依赖项属性的基本calss。例如,如果要为按钮创建依赖项属性,则将基类按钮派生到类中。

这就是我解决问题的方法。