Использование констант в XAML WPF C # происходит ошибка MarkupExtensions - PullRequest
1 голос
/ 06 мая 2019

У меня есть проект под названием 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>

Но я получаю ошибку:

MarkupExtensions не допускаются для значений свойств Uid или Name, поэтому «{x: Статические константы: Константы + ListViewContextMenu.ADD}» недопустимы.

Я ожидал работать, так как это константы ...

Ответы [ 2 ]

1 голос
/ 06 мая 2019

x: Static является расширением разметки.

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

Я думаю, что не имеет значения, что возвращает x: Static. Парсер проверяет наличие любого расширения разметки и выдает эту ошибку.

Кто бы ни разрабатывал парсер, он решил, что было бы неплохо, если бы уникальный идентификатор для объекта пользовательского интерфейса был прямо в xaml в виде строки.

Я не понимаю, почему вы хотите абстрагировать Имя таким образом.

Если имя указано в xaml, вы можете увидеть его, читая xaml. Если ваш подход сработал, вам нужно было бы найти значение в каком-то другом классе. Кажется, что все, что достигается в результате абстрагирования, затрудняет чтение xaml. Я вижу это как негатив, сам.

Думаю, стоит также объяснить лучшую практику.

Значение MVVM для подавляющего большинства команд разработчиков wpf.

Гораздо более обычным способом работы было бы связать коллекцию моделей представления с источником элементов меню. Они выставляют icommand и описание, связанное с командой и заголовком пункта меню. Не нужно знать имя любого элемента меню, по которому щелкнули, потому что он вызывает связанную команду icommand.

1 голос
/ 06 мая 2019

Не рекомендуется связывать свойство Name объекта (даже если вы используете Static расширение разметки). Мне вспоминаются две причины: метод FindName() ContextMenu не будет работать, и вы не сможете ссылаться на элементы управления из своего кода, если их имена являются динамическими (то есть они могут изменяться во время выполнения), поскольку имя неизвестно во время строительства.

Полагаю, выбрасываемое исключение предназначено для предотвращения этих проблем.

Если вам нужно использовать эти константы в вашем MenuItems, вы можете рассмотреть возможность использования свойства Tag. Я надеюсь, что это может помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...