2011-09-29 18 views
7

Estoy tratando de obligar Comando de Menultem al mandato contenido en UserControl.DataContext. He encontrado par de pregunta similar, pero la solución de acuerdo a ellos está fallando a mí:Enlazar a DataContext padre dentro DataTemplate

<UserControl ...> 
<UserControl.Resources> 
    <DataTemplate x:Key="TileItemStye"> 
     <Grid Width="100" Height="100"> 
      <Grid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Remove" 
           Command="{Binding DataContext.RemoveItem, 
           RelativeSource={RelativeSource FindAncestor, 
              AncestorType=UserControl}}"> 
        </MenuItem> 
       </ContextMenu> 
      </Grid.ContextMenu> 
     </Grid> 
    </DataTemplate> 
</UserControl.Resources> 
<Grid> 
    <ListView ItemsSource="{Binding Path=Files}" 
       ItemTemplate="{DynamicResource TileItemStye}" > 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 
</Grid> 

DataContext de control de usuario es ViewModel con ICommand RemoveItem y ObservableCollection<FileViewModel> archivos.

+0

lo que es "no" que? - Por favor, explicar el error que se obtiene .... – Carsten

+0

comando no está obligado ... no consigo ningún error, simplemente controlador que está obligado a mando nunca se llama – bkovacic

+1

Creo que el DataContext simplemente debe "llover" en su plantilla, ¿has probado Command = "{Binding Path = RemoveItem}"? – hyp

Respuesta

13

Si usted está en .NET 4 existe de hecho es una solución más elegante:

<UserControl Name="uc" ...> 
<!-- ... --> 
    <MenuItem Header="Remove" 
       Command="{Binding DataContext.RemoveItem, 
           Source={x:Reference uc}}"/> 

(Esto requiere º en las estancias de la plantilla en los recursos, de lo contrario habrá un error de dependencia cíclica)

+0

¿Puede explicar el error de dependencia? Tengo una situación similar en la que estoy usando ElementName = LayoutRoot para llegar al DataContext (mi ViewModel). pero está filtrando el modelo de vista. ¿Sería este el error de dependencia cíclica del que está hablando? alguna forma de resolver esto? (aplicación de la tienda de Windows por cierto) –

+0

@JorisWeimar: los errores de dependencia solo ocurren para 'x: Reference' en caso de que haga referencia a un control desde su árbol, p. si un 'Grid' contiene un' TextBlock' e intenta hacer referencia a 'Grid' en un enlace en' TextBlock' que causaría tal error. Solo uso 'x: Reference' aquí porque' ElementName' no funciona en el contexto de árboles desconectados. En cuanto a su problema, no entiendo lo que se supone que significa "filtrar el modelo de vista". –

+0

con la fuga del modelo de vista quiero decir que el modelo de vista no está finalizado porque hay una cierta relación con él en algún lugar desde dentro de la capa COM (lo que he recogido de PerfView). casi parece que este es un problema inherente con este tipo de construcción. –

4

Los menús no se dibujan en el mismo árbol visual como sus controles, por lo que la unión RelativeSource no funciona

Es necesario que se unen a la PlacementTarget de su ContextMenu para acceder al árbol principal de Visual

<MenuItem Header="Remove" 
      Command="{Binding PlacementTarget.DataContext.RemoveItem, 
       RelativeSource={RelativeSource FindAncestor, 
       AncestorType={x:Type ContextMenu}}}" /> 
+0

Hm ... Todavía no puedo llamar un comando. Veo cuál es tu punto, pero el enlace no funciona. – bkovacic

+0

@Pedala Podría tener la sintaxis incorrecta. Sé que desea enlazar a 'PlacementTarget', que debería devolver el control que el' ContextMenu' está unido a, pero puede que tenga que utilizar una sintaxis diferente para navegar hasta el Comando – Rachel

+0

Encuadernación usted escribió sube a la cuadrícula (el dentro de DataTemplate), pero no hasta DataContext de UserControl (donde es el comando). ¿La pregunta es si es posible anidar Bindings, entonces puedo subir desde esta cuadrícula? – bkovacic

Cuestiones relacionadas