依赖属性的CLR包装器是否可选?

时间:2011-09-23 14:53:07

标签: wpf wrapper dependency-properties

我认为依赖属性的CLR包装器在WPF下是可选的,只对在自己的代码中设置很有用。

但是,我创建了一个没有包装器的UserControl,但是一些使用它的XAML在没有它们的情况下将无法编译:

namespace MyControlLib
{
    public partial class MyControl : UserControl
    {
        public static readonly DependencyProperty SomethingProperty;

        static MyControl()
        {
            SomethingProperty = DependencyProperty.Register("Something", typeof(int), typeof(MyControl));
        }
    }
}

XAML用法:

<Window  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:ctrl="clr-namespace:MyControlLib;assembly=MyControlLib">

   <ctrl:MyControl Something="45" />

</Window>

尝试编译它会给出:

错误MC3072:XML命名空间'clr-namespace:MyControlLib'中不存在属性'Something'。行等等等等等等等等。

在MyControl.xaml.cs中添加CLR包装器,如:

public int Something
{
    get { return (int)GetValue(SomethingProperty); }
    set { SetValue(SomethingProperty, value); }
}

意味着它所有编译和工作正常。

我错过了什么?

2 个答案:

答案 0 :(得分:4)

您可以在运行时绑定中使用不带包装器的依赖项属性,但是要设置属性,您必须具有C#属性以允许xaml编译器编译代码。

答案 1 :(得分:1)

我相信如果在属性上指定名称空间前缀,它将在没有包装器的情况下进行编译。

它们是可选的,但没有它们,属性不会自动显示在XAML设计器中

<ctrl:MyControl ctrl:MyControl.Something="45" />