Команда связывания WPF + и заголовок элемента контекстного меню с использованием MVVM - PullRequest
2 голосов
/ 11 июня 2011

Я создал приложение 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> 

Ответы [ 3 ]

1 голос
/ 12 июня 2011

Hi. Выявлена ​​проблема.

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

Нам нужно обращаться с кодом как с умом.

Поскольку отладка невозможна для привязки, я бился вокруг куста: -)

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

0 голосов
/ 11 июня 2011

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

<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}}" />
0 голосов
/ 11 июня 2011

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

...