Команда привязки WPF и заголовок пункта контекстного меню с использованием MVVM

#wpf #mvvm #binding #header #command

#wpf #mvvm #привязка #заголовок #команда

Вопрос:

Я создал приложение WPF и следую шаблону MVVM. У меня есть контекстное меню в моем xaml, и мне нужно привязать команду и текст заголовка. Используя следующий код, я могу привязать заголовок контекстного меню к «MenuItemName», который является свойством в BOList, представляющим собой наблюдаемую коллекцию. Моя проблема в том, что команда не запускается? Я изменил источник элемента контекстного меню на datacontext

 (DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}") 
  

Команда работает нормально, но мой заголовок становится пустым. Есть ли способ привязать мой заголовок и команду элемента меню? Здесь команда MenuClick является свойством Icommand в виртуальной машине, а MenuItemName — это свойство внутри BOList, которое представляет собой наблюдаемую коллекцию, привязанную к моему ListBox.

 <Grid>
<StackPanel Orientation="Vertical">
   <Button x:Name="btnClickMe" Command="{Binding ButtonCommand}" Content="Click Me" />
  <ListBox ItemsSource="{Binding BOList}" x:Name="lstDemo" SelectedItem="{Binding BussinessObj,Mode=OneWayToSource}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel x:Name="stkStyleRender" Orientation="Horizontal" Background="Cyan" Width="525"  Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" >
          <TextBlock x:Name="txtId" Text="{Binding FirstName}"></TextBlock>
          <TextBlock x:Name="txtName" Text="{Binding LastName}"></TextBlock>
          <StackPanel.ContextMenu>
            <ContextMenu x:Name="cntMnuTest" ItemsSource ="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" >
              <MenuItem Header="{Binding MenuItemName}"  Command="{Binding MenuClick}" CommandParameter="Icon"></MenuItem>
            </ContextMenu> 
          </StackPanel.ContextMenu>

        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
 </ListBox>
</StackPanel> 
  

Комментарии:

1. как выглядит MenuItemName в ViewModel? также найдите в выводе консоли ошибку выражения привязки и опубликуйте, что это такое, если вы ее видите.

Ответ №1:

Привет, выявил проблему.

Если мы установим для источника элемента контекстного меню значение BOList (наблюдаемая коллекция), команда не будет запущена, потому что ICommand определение находится в контексте данных окна (vm).

Нам нужно обработать код подобным образом.

Поскольку отладка для привязки невозможна, я ходил вокруг да около 🙂

Эта ссылка мне очень помогла Руководство по WPF — Отладка проблем с привязкой данных в WPF

Ответ №2:

В контекстном меню используйте DataContext вместо использования Items source
затем привяжите свой элемент меню

Комментарии:

1. Я пробовал это, если datacontext установлен, команда работает, но привязка свойства заголовка завершается неудачей,, если установлен источник элемента, привязка заголовка работает, но привязка команды завершается неудачей ,,,

2. Привет, выявил проблему. Если мы установим для источника элемента контекстного меню значение BOList (наблюдаемая коллекция), команда не будет запущена, потому что определение icommand находится в ciontext данных окна (vm). Нам нужно обработать код подобным образом. Поскольку отладка для привязки невозможна, я ходил вокруг да около 🙂 .. ЭТА ссылка мне очень помогла wpftutorial.net/DebugDataBinding.html

Ответ №3:

попробуйте это:

 <MenuItem Header="{Binding Path=PlacementTarget.MenuItemName, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}"  Command="{Binding Path=PlacementTarget.MenuClick, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}" />
  

Комментарии:

1. Если вы установите DataContext, то произойдет привязка команды, и если мы установим привязку заголовка источника элемента .. ??? <Контекстное меню x:Name=»cntMnuTest» ItemsSource =»{Путь привязки=PlacementTarget. Тег, RelativeSource={RelativeSource Self}}» > <MenuItem Header=»{Binding MenuItemName}» Command=»{Binding MenuClick}» CommandParameter=»Icon»></MenuItem> </ContextMenu>