2009-09-03 5 views
1

У меня есть столбец DataGrid, как показано ниже:ContextMenu Связывание Источник в DataGrid с помощью MVVM

<toolkit:DataGridTemplateColumn> 
         <toolkit:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Path=LabelName}" Background="{Binding Path=Color}"> 
            <TextBlock.ContextMenu> 
             <ContextMenu> 
              <MenuItem x:Name="Assign" Header="Assign" 
                 mvvm:CommandBehavior.Event="Click" 
                 mvvm:CommandBehavior.Command="{Binding Path=DataContext.EditLabelCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}, AncestorLevel='1'}}" 
                 mvvm:CommandBehavior.CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=DataContext}"/> 
             </ContextMenu> 
            </TextBlock.ContextMenu> 
           </TextBlock> 
          </DataTemplate> 
         </toolkit:DataGridTemplateColumn.CellTemplate> 

Я пытаюсь добраться до EditLabelCommand в DataContext, но я не могу найти источник привязки , Что мне делать для доступа к моим командам DataContext?

ответ

3

DataContext изменяется при перемещении вниз по визуальному дереву, когда вы a) привязываете DataContext к чему-то другому или b) используете что-то вроде элемента управления элементами (или в вашем случае сеткой), который повторяет шаблон данных один раз за элемент в коллекции, устанавливая контекст данных для каждого элемента.

В вашем примере ваш пункт меню имеет тот же DataContext, что и ваш TextBlock. Это будет объект, привязанный к каждой строке вашей сетки данных.

Основываясь на вашем коде, я думаю, что у вас есть один EditLabelCommand, доступный в наборе DataContext для всего вашего UserControl. Вероятно, это родительский сбор, который вы привязываете к сетке. (Пожалуйста, поправьте меня, если какие-либо из этих предположений неправильно.)

Если это так, есть несколько вещей, которые вы можете сделать:

  • Вы можете продолжать обвязку родственника. Это сложно и ошибка склонна, как вы видели, и не приводит к хорошему повторному использованию ваших данных. шаблоны или другие XAML. Я рекомендую вам избегать этой техники.

  • Более простой способ сохранить команду в целом DataContext является использования CommandReference из WPF Model-View-ViewModel Toolkit. Это позволяет ссылаться на команду как ресурс и использовать привязку ресурса к . Как это:

 
    <UserControl.Resources> 
     <mvvmToolkit:CommandReference x:Key="EditLabelCommandReference" Command="{Binding EditLabelCommand}" /> 
    </UserControl.Resources> 

    <!-- Your command binding then looks much simpler --> 
    mvvm:CommandBehavior.Command="{StaticResource EditLabelCommandReference}" 
  • Другой метод (вероятно, лучше), чтобы реорганизовать использовать шаблон MVVM для каждой строки. Таким образом, вы должны использовать простой ViewModel для каждой строки вашей сетки. Это позволяет каждой строке поддерживать свое собственное состояние. Поскольку вы можете переместить реализацию Command в этот ViewModel, у вас есть команда на строку и нет необходимости передавать аргумент. Это позволяет редактировать одновременно несколько ярлыков. (Если это требование.)
Смежные вопросы