2013-06-07 20 views
7

sto correndo un semplice progetto MVVM e caduto al primo ostacolo. Lego i miei comandi usando l'approccio del comando di rilancio Josh Smiths.non può legarsi all'interno di dizionario risorse

Il problema è, il pulsante non è vincolante quando il pulsante è nella ResourceDictionary. Se sposto il codice (esattamente come è) nel mio MainWindow.xaml, il codice viene eseguito come desiderato.

Questo è il mio MainWindow.xaml

<Window x:Class="ForJon.Views.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vm="clr-namespace:ForJon.Ui.ViewModels" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="160" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Grid.Resources> 
     <ResourceDictionary Source="Resources\ResourceDictionary.xaml" /> 
    </Grid.Resources> 

    <Grid.DataContext> 
     <vm:MainWindowViewModel /> 
    </Grid.DataContext> 

    <HeaderedContentControl 
     Header="Options" 
     Style="{StaticResource LeftMenu}" 
     Grid.Column="0" 
     /> 

    </Grid> 
</Window> 

E il dizionario risorse

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:view="clr-namespace:ForJon.Ui.Views" 
        xmlns:viewModel="clr-namespace:ForJon.Ui.ViewModels" 
        > 

    <Style x:Key="LeftMenu" TargetType="HeaderedContentControl"> 
     <Setter Property="HeaderTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
         <StackPanel> 
          <Button Content="Add" Command="{Binding AddCommand}" /> 
         </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Width" Value="160"/> 
    </Style> 

</ResourceDictionary> 

Posso solo supporre che quando vincolante nel ResourceDictionary che non riesce a trovare il ViewModel (anche se io don Non so perché lo penso). Penso che stia cercando di associare un livello extra giù ...

Qualsiasi modo, qualcuno può spiegare perché non è in esecuzione all'interno del dizionario risorse per favore.

risposta

8

Questo problema sembra non avere molto a che fare con la ResourceDictionary che avere il pass genitore DataContext al DataTemplate

Se si copia il Style e metterlo nella Grid.Resources e commentare le dizionario risorse lo stesso comportamento può essere visto. trasformando anche in caso di errori di rilegatura dovrebbe mostrare

System.Windows.Data Error: 40 : BindingExpression path error: 'AddCommand' property not found on 'object' ''String' 

Fix è più o meno ottenere il DataContext attraverso.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Style x:Key="LeftMenu" 
     TargetType="HeaderedContentControl"> 
    <Setter Property="HeaderTemplate"> 
     <Setter.Value> 
     <DataTemplate> 
      <StackPanel DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type HeaderedContentControl}}, Path=DataContext}"> 
      <Button Command="{Binding AddCommand}" 
        Content="Add" /> 
      </StackPanel> 
     </DataTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Width" 
      Value="160" /> 
    </Style> 
</ResourceDictionary> 

stesso problema vale per ContentTemplate ma Template funziona bene (Esso utilizza una ControlTemplate)

<Setter Property="Template"> 
    <Setter.Value> 
    <ControlTemplate TargetType="{x:Type HeaderedContentControl}"> 
     <StackPanel> 
     <Button Command="{Binding AddCommand}" 
       Content="Add" /> 
     </StackPanel> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
+1

Questo risolve il problema, ma sicuramente ci deve essere un approccio più elegante di quello che ho fatto? Sarebbe meglio dichiarare DataContext nel Dizionario delle risorse, invece? Grazie! – Dave

+4

@DaveRook Ottenere il DataContext tramite l'associazione di una RelativeSource non è affatto male, quando si sa che cosa il vostro fare. Tuttavia, se chiedi la mia opinione personale, non lo farei neanche io. Il concetto di dizionario risorse è per noi di riutilizzare il controllo di, ma quando abbiamo di legame nel dizionario risorsa che abbiamo fondamentalmente legato il 'style' fino ad una molto specifica VM & View che significa che potrebbe essere stato meglio definirla nell'articolo in se direttamente. – Viv

+0

Wow, Viv, grazie. Birre su di me per questo. Sì, capisco perché tu prenda questo approccio, questo è veramente eccellente e un aiuto enorme. – Dave

Problemi correlati