2011-09-29 16 views
7

Sto tentando di associare il comando MenuItem al comando contenuto in UserControl.DataContext. Ho trovato qualche domanda simile, ma la soluzione secondo loro non riesce a me:Associazione a DataContext padre all'interno di 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 di UserControl è ViewModel con ICommand RemoveItem e ObservableCollection<FileViewModel> file.

+0

che cosa è "non riuscire" a voi? - Per favore spiega l'errore che ottieni .... – Carsten

+0

Il comando non è vincolato ... Non ho alcun errore, solo il gestore che è legato al comando non viene mai chiamato – bkovacic

+1

Penso che il Datacontext dovrebbe semplicemente "piovere" sul tuo modello, hai provato Command = "{Binding Path = RemoveItem}"? – hyp

risposta

13

Se siete su .NET 4 c'è in effetti è una soluzione più elegante:

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

(Questo richiede ° al modello rimane nelle risorse, altrimenti ci sarà un errore di dipendenza ciclico)

+0

puoi elaborare l'errore di dipendenza? ho una situazione simile in cui sto usando ElementName = LayoutRoot per arrivare al DataContext (my ViewModel). ma sta perdendo il viewmodel. questo sarebbe l'errore di depiction ciclica di cui stai parlando? un modo per risolvere questo? (windows store app btw) –

+0

@JorisWeimar: gli errori di dipendenza si verificano solo per 'x: Reference' nel caso in cui si fa riferimento a un controllo all'interno della sua struttura ad albero, ad es. se una 'Grid' contiene un' TextBlock' e si prova a fare riferimento a 'Grid' in un binding su' TextBlock' che causerebbe un tale errore. Io uso solo 'x: Reference' qui perché' ElementName' non funziona nel contesto di alberi sconnessi. Per quanto riguarda il tuo problema, non capisco cosa significhi "perdere il viewmodel". –

+0

con la perdita del viewmodel intendo che il viewmodel non è finalizzato perché c'è un riferimento ad esso da qualche parte all'interno del livello COM (ciò che ho raccolto da PerfView). sembra quasi che questo sia un problema inerente a questo tipo di costruzione. –

4

I menu non sono disegnate nello stesso albero visiva come i controlli, che è il motivo per cui il legame RelativeSource non funziona

È necessario legarsi al PlacementTarget del ContextMenu per accedere al principale di Visual Albero

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

Hm ... Non riesco ancora a chiamare un comando. Vedo qual è il tuo punto, ma il binding non funziona. – bkovacic

+0

@Pedala Potrei avere la sintassi sbagliata. So che vuoi associare a 'PlacementTarget', che dovrebbe restituire il Controllo a cui è collegato' ContextMenu', ma potresti dover utilizzare una sintassi diversa per accedere al comando. – Rachel

+0

Il binding che hai scritto va a Grid (quello all'interno di DataTemplate), ma non fino al DataContext di UserControl (dove è il comando). È questione se sia possibile nidificare i binding, quindi posso salire da questa griglia? – bkovacic

Problemi correlati