繁体   English   中英

在XAML WPF C#中使用常量会发生MarkupExtensions错误

[英]Use Constants in XAML WPF C# occur MarkupExtensions error

我在一个名为Common的项目中,并且有一个Constants类:

public static class Constants
{
    public class ListViewContextMenu
    {
        public const string ADD = "addToolStripMenuItem";
        public const string RENAME = "renameToolStripMenuItem";
        public const string DISABLE = "disableToolStripMenuItem";
        public const string DELETE = "deleteToolStripMenuItem";

        public const string ADD_TEXT = "Add";
        public const string RENAME_TEXT = "Rename";
        public const string DISABLE_TEXT = "Disable";
        public const string ENABLE_TEXT = "Enable";
    }
}

在其他项目中,WPF在哪里,我想在上下文菜单标题中使用以上常量:

xmlns:constants="clr-namespace:Common;assembly=Common"

<ListView HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Column="0" Name="listView1" SelectionMode="Single" ItemsSource="{Binding TrackerList,Mode=TwoWay}" DisplayMemberPath="Title">
    <ListView.ContextMenu>
        <ContextMenu Name="lv_ctx">
            <MenuItem Header="Add" Name="{x:Static constants:Constants+ListViewContextMenu.ADD}"></MenuItem>
            <Separator/>
            <MenuItem Header="{x:Static constants:Constants+ListViewContextMenu.RENAME_TEXT}" Name="{x:Static constants:Constants+ListViewContextMenu.RENAME}"></MenuItem>
            <MenuItem Header="{x:Static constants:Constants+ListViewContextMenu.DELETE_TEXT}" Name="{x:Static constants:Constants+ListViewContextMenu.DELETE}"></MenuItem>
            <MenuItem Header="{x:Static constants:Constants+ListViewContextMenu.DISABLE_TEXT}" Name="{x:Static constants:Constants+ListViewContextMenu.DISABLE}"></MenuItem>
        </ContextMenu>
    </ListView.ContextMenu>
</ListView>

但是我得到了错误:

Uid或Name属性值不允许使用MarkupExtensions,因此'{x:Static constants:Constants + ListViewContextMenu.ADD}'无效。

我希望能继续工作,因为这些都是常量。

绑定对象的Name属性不是一个好主意(即使您正在使用Static标记扩展)。 我想到两个原因: FindName() ContextMenu方法将不起作用,并且如果它们的名称是动态的(例如,它们可以在运行时更改),则无法从代码背后引用控件,因为在构建时该名称未知时间。

我想抛出该异常是为了防止这些问题。

如果需要在MenuItems使用这些常量,则可以考虑使用Tag属性。 希望对您有所帮助。

x:静态是标记扩展。

https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/advanced/markup-extensions-and-wpf-xaml

我认为x:Static返回什么都没关系。 解析器正在检查任何标记扩展,并引发该错误。

设计解析器的人决定,如果在xaml中以字符串形式存在ui对象的唯一标识符,这是一个好主意。

我看不到您为什么要以这种方式抽象Name的原因。

如果在xaml中设置了“名称”,则在阅读xaml时可以看到它。 如果您的方法可行,那么您将需要在其他类中找到该值。 似乎实现的所有摘要使阅读xaml变得更加困难。 我个人认为这是负面的。

我认为也有必要解释最佳做法。

对于绝大多数wpf开发团队而言,MVVM的含义是。

一种更常见的工作方式是将视图模型的集合绑定到菜单的itemssource。 它们将公开与命令和菜单项的标题绑定的icommand和描述。 无需知道单击的任何菜单项的名称,因为它会调用绑定的icommand。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM