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

发布于 2024-12-06 05:04:16 字数 1134 浏览 1 评论 0原文

我的印象是,依赖属性的 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 中不存在属性“Something” -命名空间:MyControlLib'。行 blah 位置 blah。

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

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

意味着一切都可以编译并正常工作。

我缺少什么?

I was under the impression that CLR wrappers for dependency properties were optional under WPF, and just useful for setting within your own code.

However, I have created a UserControl without wrappers, but some XAML that uses it will not compile without them:

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

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

XAML usage:

<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>

Trying to compile this gives:

error MC3072: The property 'Something' does not exist in XML namespace 'clr-namespace:MyControlLib'. Line blah Position blah.

Adding a CLR wrapper in MyControl.xaml.cs like:

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

means it all compiles and works fine.

What am I missing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

面如桃花 2024-12-13 05:04:16

您可以在运行时绑定内使用没有包装器的依赖属性,但要按照您想要的方式设置属性,您必须具有 C# 属性以允许 xaml 编译器编译您的代码。

You could use dependency properties without wrappers inside runtime bindings, but to set the property like you want you must have C# property to allow xaml compiler to compile your code.

晨光如昨 2024-12-13 05:04:16

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

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

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

I believe it will compile without the wrappers if you specify the namespace prefix on the property.

They are optional, but without them the property does not show up in the XAML designer automatically

<ctrl:MyControl ctrl:MyControl.Something="45" />
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文