#c# #wpf #xaml #mvvm #binding
#c# #wpf #xaml #mvvm #привязка
Вопрос:
Я пытаюсь создать строку меню для своего приложения. Я создал коллекцию в xaml, которая будет содержать пункты меню, к которым будет привязано мое меню.
В xaml я создал массив, который я использую в качестве своего статического ресурса для привязки.
<coll:ArrayList x:Key="MenuOptionsList">
<model:DashboardMenuBarItem
Icon="the location of an image in my images folder"
DisplayName="The test that will appear under my button"
CommandName="someCommandInMyViewModel"/>
</coll:ArrayList>
Я использую listbox с шаблоном данных, чтобы отобразить эти элементы следующим образом.
<ListBox x:Name="lstNavigateTo" MinWidth="400" DockPanel.Dock="Top"
ItemsSource="{Binding Source={StaticResource MenuOptionsList}}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
Style="{StaticResource horizontalListTemplate}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="5">
<Button Height="60" Width="60"
Command="{Binding Mode=OneWay, Path=CommandName}">
<Button.Content>
<Image Source="{Binding Path=Icon}" Grid.Row="0" />
</Button.Content>
</Button>
<TextBlock Text="{Binding Path=DisplayName}"
Width="100" TextAlignment="Center" Grid.Row="1" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Моя проблема в том, что я использую шаблон проектирования MVVM и не могу заставить привязки команд работать при нажатии кнопки. Раньше я бы управлял нажатием кнопки следующим образом.
Command="{Binding someCommandInMyViewModel}"
Это работало бы нормально, но когда я пытаюсь привязать команду к свойству элемента в моей коллекции, команда не запускается.
Кто-нибудь знает, как я могу этого добиться.
Комментарии:
1. Работают ли остальные привязки шаблонов, т. Е. все ли ваши значок и текст отображаются правильно? Кроме того, поддерживает ли ваша команда CanExecute, и если да, то загорается ли кнопка вообще?
2. Все остальное работает, кроме привязок команд. Я вижу кнопки и их изображения, но функциональности нет. Я считаю, что @Kent Boogaart попал в самую точку. У меня пока недостаточно опыта работы с MVVM и привязкой команд, чтобы делать то, что я хочу, особенно создавать конвертер для преобразования строки в ICommand.
3. Первое, что вам нужно сделать, это включить отладочные сообщения для привязки данных: i.imgur.com/UAxJO.png Затем повторно запустите и проверьте окно вывода и посмотрите, какие ошибки там. Во-вторых, вы делаете это неправильно. Нет, это немного грубо… Вы делаете это странно .
Ответ №1:
CommandName
Свойство в вашей коллекции имеет тип String
, тогда как Command
свойство в Button
имеет тип ICommand
. Каким образом вы ожидаете, что WPF разрешит ICommand
из String
? Вам нужно будет помочь этому: либо создать конвертер и использовать его в своей привязке, либо изменить свое CommandName
свойство так, чтобы оно содержало фактическое ICommand
значение, а не String
a.
Комментарии:
1. Есть ли в xaml возможность для меня просто передать имя команды свойству command в шаблоне? Я понимаю, почему моя привязка не работает.
2. По сути, то, что вы пытаетесь сделать, это следующее:
Command="{Binding Mode=OneWay, Path={Binding CommandName}}"
, что невозможно. Возможно, было бы лучше выполнить одну и ту же команду независимо от пункта меню и передать имя команды какCommandParameter
. Оттуда вы могли бы разрешить и выполнить команду. Есть много способов сделать это — трудно дать конкретный совет, не понимая полностью вашу инфраструктуру.