Проблема при настройке привязок команд в XAML

#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 . Оттуда вы могли бы разрешить и выполнить команду. Есть много способов сделать это — трудно дать конкретный совет, не понимая полностью вашу инфраструктуру.