Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';这是';名称';注册DependencyProperty时的参数?_C#_Wpf_Dependency Properties_Attached Properties - Fatal编程技术网

C# 什么';这是';名称';注册DependencyProperty时的参数?

C# 什么';这是';名称';注册DependencyProperty时的参数?,c#,wpf,dependency-properties,attached-properties,C#,Wpf,Dependency Properties,Attached Properties,简单的问题。注册依赖项属性时,name参数的用途是什么?我从来没有看到它在任何地方使用过,而且它似乎也不必是独一无二的。我不太清楚这有什么意义 我通常只是像下面这样设置,然后忘记它: public static readonly DependencyProperty SupportsPlayProperty = DependencyProperty.Register( nameof(SupportsPlay), typeof(bool), typeof(Player

简单的问题。注册依赖项属性时,
name
参数的用途是什么?我从来没有看到它在任何地方使用过,而且它似乎也不必是独一无二的。我不太清楚这有什么意义

我通常只是像下面这样设置,然后忘记它:

public static readonly DependencyProperty SupportsPlayProperty = DependencyProperty.Register(
     nameof(SupportsPlay),
     typeof(bool),
     typeof(Player),
     new FrameworkPropertyMetadata(true));

public bool SupportsPlay {
    get => (bool)GetValue(SupportsPlayProperty);
    set => SetValue(SupportsPlayProperty, value);
}
当然,我不能对附加的属性执行此操作,因为它们没有任何CLR属性(按照约定)与之配对。我只是想包装
dependencProperty
而不是CLR属性(这意味着它将有额外的“property”后缀),但我遇到了一个案例,两个不同类中的两个不同附加属性被称为“Enabled”,这让我对该属性感到好奇

public static class ClearSelectionOnLostFocus {

    public static readonly DependencyProperty EnabledProperty = DependencyProperty.RegisterAttached(
        nameof(EnabledProperty),
        typeof(bool),
        typeof(ClearSelectionOnLostFocus),
        new FrameworkPropertyMetadata(false, ClearSelectionOnLostFocus_Changed));

    ...
}
那么名称的意义是什么呢?

阅读Concurrens me,该值在内部使用,必须遵循此命名约定

对于依赖项属性,您必须遵循已建立的命名约定

该名称在每个注册类型中必须是唯一的。(“SupportsPlay”,我们正在讨论的名称

创建标识符字段时,请使用注册时的属性名称以及后缀属性来命名此字段。(支持SplayProperty

同样,按照约定,包装器属性(public bool SupportsPlay)的名称必须与注册该属性的寄存器调用的第一个参数所选择和给定的名称相同

public static class ClearSelectionOnLostFocus {

    public static readonly DependencyProperty EnabledProperty = DependencyProperty.RegisterAttached(
        nameof(EnabledProperty),
        typeof(bool),
        typeof(ClearSelectionOnLostFocus),
        new FrameworkPropertyMetadata(false, ClearSelectionOnLostFocus_Changed));

    ...
}
在该页面中可以找到一条警告

如果您的财产不符合约定,这并不一定会禁用所有可能的用途,但您将遇到几个值得注意的问题

样式和模板的某些方面不起作用

大多数工具和设计器必须依赖命名约定来正确序列化XAML,或者在每个属性级别提供设计器环境帮助

WPF XAML加载器的当前实现完全绕过包装器,并在处理属性值时依赖命名约定


我到处找了找。好发现!一定是跳过了。好的,看起来我为非附加属性所做的工作会起作用,但是附加属性,我不能使用
name(FooProperty)
,因为它有后缀“property”,文档中说不应该是这样。谢谢果然,我刚刚运行了一个测试,在一个附加属性中,我为名称传入了'EnabledProperty',在模板中分配了它,然后它在加载程序中崩溃了。我把它改回“Enabled”,加载程序按预期工作。很高兴知道!我认为它在大多数情况下都有效,即使您选择了GUID这样的名称。但是像XAML designer这样的MS工具在内部使用这个值,我们只是不知道它什么时候会失败。间歇性错误是最令人讨厌的,因为你需要找到一个模式来重新编程,对吗?所以最好还是按照惯例来做。我只是用了一个GUID来测试,它似乎起作用了:)如果你直接添加它,它会起作用,但是试着通过一个指向
文本框
的样式来添加它(只需使用
TargetType
,不要使用键,这样它就适用于所有
文本框
实例),然后通过样式中的
元素进行设置。这就是我在名字不对的时候崩溃的原因。不会装我的窗户。将其更改为预期名称,并且工作正常。