WPF: добавление команды к каждому элементу меню в динамическом меню с привязкой к данным - PullRequest
0 голосов
/ 02 мая 2011

Как добавить команду к каждому элементу в меню с привязкой к данным? В принципе, у меня есть что-то вроде этого:

     <MenuItem Header="View" ItemsSource="{Binding ...}" />

Для каждого элемента в меню мне нужно дать ему команду на основе его DataContext. Я не могу использовать ItemTemplate, так как шаблон находится внутри сгенерированного контейнера MenuItem. Да, и команды должны иметь жесты ввода, поэтому они должны быть сгенерированы до открытия меню.

Есть ли лучший способ сделать это? Может быть, я должен добавить / удалить элементы в коде позади?

1 Ответ

1 голос
/ 03 мая 2011

Помните, что MenuItem (и Menu) - это просто ItemsControls. Это означает, что вы можете привязать к нему коллекцию чего угодно. Другими словами, вы можете связать его с набором всего, что имеет ICommand (он же ваша модель представления).

Но мы не хотим этого, мы хотим, чтобы MenuItems были правы? Так что вы можете сделать коллекцию, которую вы привязываете к коллекции MenuItems, которую вы создаете за кулисами.

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

Так что вместо этого мы можем привязать коллекцию ваших объектов бизнеса, но использовать пользовательский TypeConverter , чтобы преобразовать этот список в список элементов MenuIms, которые правильно привязаны к каждому из них. объект

Что действительно хорошо в этом подходе, так это то, что он работает независимо от глубины структуры меню. Преобразователь типов может пройти через вашу модель представления и рекурсивно добавлять новые привязки, которые, в свою очередь, используют один и тот же преобразователь типов

Другой вариант - создать DataTemplate для вашей модели представления элемента меню, которая, в свою очередь, содержит MenuItem, но я не совсем уверен, как обрабатывать жесты с использованием этого подхода. хотя это возможно, и такой подход также рекурсивен.

...