2011-01-25 18 views
13

En mi archivo XAML tengo un DataGrid con un menú contextual. La fuente de datos es un ViewModel que tiene una propiedad EntityCollection (una ObservableCollection) como ItemsSource de DataGrid y otra colección ContextMenu.MenuItems que sirve como origen de datos para crear un menú contextual en DataGrid. Los elementos de esa colección tienen un Command propiedad que ato a la propiedad de comando de los elementos del menú:Enlazar un parámetro de comando de menú contextual a una propiedad de cuadrícula de datos

<DataGrid Name="EntityDataGrid" ItemsSource="{Binding EntityCollection}" Height="450"> 
    <DataGrid.ContextMenu> 
    <ContextMenu ItemsSource="{Binding Path=ContextMenu.MenuItems}"> 
     <ContextMenu.ItemContainerStyle> 
     <Style TargetType="{x:Type MenuItem}"> 
      <Setter Property="Command" Value="{Binding Command}" /> 
      <Setter Property="CommandParameter" 
        Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" /> 
     </Style> 
     </ContextMenu.ItemContainerStyle> 
    </ContextMenu> 
    </DataGrid.ContextMenu> 
</DataGrid> 

La acción para el comando de menú tiene la siguiente firma en el modelo de vista:

private void SelectedItemsAction(object parameter) 
{ 
    // Do something with "parameter" 
} 

Ahora mi problema es que alcanzo el SelectedItemsAction cuando hago clic en un elemento del menú contextual, pero el parameter es null. Creo que mi problema está en el establecimiento de la propiedad CommandParameter. Como se puede ver, quiero enlazar esta propiedad a la propiedad SelectedItems de la cuadrícula de datos estableciendo el valor a: los valores más simples

<Setter Property="CommandParameter" 
     Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" /> 

que he probado como una prueba:

<Setter Property="CommandParameter" 
     Value="{Binding ElementName=EntityDataGrid, Path=Height}" /> 

Aquí parameter sigue siendo null. Y a continuación, sólo para probar si algún parámetro alcanza mi método acción en absoluto:

<Setter Property="CommandParameter" 
     Value="10" /> 

Esto funciona, el parameter en mi método de acción es ahora de hecho 10.

¿Qué estoy haciendo mal para vincular el valor CommandParameter a una propiedad de EntityDataGrid? ¿Es posible?

¡Gracias por la ayuda con anticipación!

Respuesta

7

¿Ha intentado hacer un encuadernación de antepasado? Algo así como:

<Setter Property="CommandParameter" 
     Value="{Binding Path=SelectedItems, 
     RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
+0

Genial, gracias, esto funciona! (Ahora solo necesito leer un poco más sobre el enlace de WPF para entender lo que su código está haciendo exactamente;)) – Slauma

+0

Está caminando por el árbol para encontrar un artículo que coincida con ese tipo. El primero que lo usa lo usa como el contexto vinculante. – CodeWarrior

+0

Mientras tanto, he leído más sobre encuadernación y ahora está claro por qué mi marcado original no funcionó y por qué su código es el correcto. ¡Gracias por la explicación! – Slauma

11

El ContextMenu no está en la misma parte del árbol visual así que por eso no se puede utilizar ElementName etc, para hacer referencia a la DataGrid. En su lugar, tendrá que usar PlacementTarget del ContextMenu. Pruébalo así

<ContextMenu ItemsSource="{Binding Path=ContextMenu.MenuItems}"> 
    <ContextMenu.ItemContainerStyle> 
     <Style TargetType="{x:Type MenuItem}"> 
      <Setter Property="Command" Value="{Binding Command}" /> 
      <Setter Property="CommandParameter" 
        Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, 
            Path=PlacementTarget.SelectedItems}" /> 
     </Style> 
    </ContextMenu.ItemContainerStyle> 
</ContextMenu> 
+0

¡Gracias, esto también funciona! (Marqué la solución de OffApps Cory como respuesta aceptada, solo porque respondió unas horas antes. De todos modos, ¡gracias por tu esfuerzo!) – Slauma

+2

+1 ¡Finalmente lo encontré! Esto funcionó para mí cuando usé 'RelayCommand' junto con' CommandParameter' del MVVM Light Toolkit. Me gustaría que WPF hiciera que 'ElementName' funcionara independientemente de dónde estuvieran los elementos en el árbol de elementos. ¡Gracias por compartir esta variación de enlace 'ContextMenu'! – SliverNinja

Cuestiones relacionadas