为什么WPF XAML Intellisense仅显示包含公共getter的字段?

时间:2017-09-08 23:31:36

标签: c# wpf visual-studio xaml intellisense

我想知道为什么我的Visual Studio 2017 Intellisense只显示带有公共getter的字段。在这个特殊情况下,带有公共getter的静态字段,因为我试图将一些静态/常量字段加载到WPF内容中。

Intellisense in XAML

正如您在下面的代码中看到的,我已向App类添加了三个不同的字段,但只显示了一个(StaticGetterName)。有趣的事实是,如果我在拼写中没有任何错误地键入它,那么其他两个字段(StaticField& ConstantName)正在顺利运行。该项目使用App class。

中的任意三个字段成功构建并运行

我已经尝试过其他名称空间,其他类尝试将static关键字添加到类声明中 - 到目前为止没有变化。此外,partial关键字也不是问题。

如果我要写一些粘合剂,那就没问题了。只显示公共吸气剂的建议就足够了。但是当涉及到所有类型的静态字段时?不太多。

我已经看到了其他问题所以我推断出XAML Intellisense仍然存在一些漏洞,但要澄清一下 - 这不是Intellisense无法正常工作的情况。确实它有效,在我看来,它并没有显示所有可能的自动完成。

App.xaml.cs

namespace DSIK.ClientApp
{
    using System.Windows;

    public partial class App : Application
    {
        public const string ConstantName = "Client";

        public static string StaticField = ConstantName;

        public static string StaticGetterName => ConstantName;
    }
}

MainWindow.xaml

<Window x:Class="DSIK.ClientApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DSIK.ClientApp"
        Title="{x:Static local:App.StaticGetterName}" Height="460" Width="570">
    <Grid>

    </Grid>
</Window>

1 个答案:

答案 0 :(得分:1)

我很简短,因为Xaml类型的系统和模式模型只有属性的概念。没有领域的概念。可以使用默认模式上下文将CLR字段视为Xaml属性,但从未完成过。我想没有理由,因为在.NET中通常不鼓励使用公共的非最终字段。

Xaml类型模型也没有保护级别的概念。这可能是一个刻意的设计决定。可以在Xaml标记中声明的所有成员都必须是公共的。这是有意义的,因为Xaml(或Baml)在运行时被解析,并且Xaml可以完全存在于项目和程序集的领域之外,因此没有明确和一致的方式来处理internal成员,因为例。并且来自Xaml的对象的构造不会在构造对象的实例的上下文中发生。换句话说,Xaml从外部构建对象,因此它不能支持privateprotected成员。

最后,常量和字段有点不同。即使公共字段确实映射到Xaml属性,也没有理由映射常量,因为它们不可能在Xaml中设置。同样适用于只读字段,就像只读属性(或没有公共设置器的属性)一样。