[英]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.