2013-06-07 7 views
7

Ich bin ein einfaches MVVM Projekt läuft und an der ersten Hürde gefallen. Ich binde meine Befehle mit Josh Smiths Relay Command-Ansatz.binden kann nicht innerhalb von Ressourcenverzeichnis

Das Problem ist, wird der Button nicht verbindlich, wenn der Knopf in der Resource ist. Wenn ich den Code (genau so) in meine MainWindow.xaml verschiebe, wird der Code wie gewünscht ausgeführt.

Das ist mein 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> 

Und das Ressourcenverzeichnis

<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> 

ich nur annehmen kann, wenn in den Resource Bindung, dass es nicht das Viewmodel (obwohl ich don finden Ich weiß nicht warum ich das denke. Ich denke, dass es versucht, eine zusätzliche Ebene zu binden unten ...

Jede Art und Weise, kann jemand erklären, warum es nicht aus dem Ressource Wörterbuch Ausführung bitte.

Antwort

8

Dieses Problem scheint nicht viel zu haben, mit dem Resource zu tun, um die Eltern DataContext Querpass auf DataTemplate

, als wenn Sie die Style kopieren und in den Grid.Resources zu setzen und kommentieren die Ressource Wörterbuch das gleiche Verhalten sein kann gesehen. Auch auf Binding Fehler Drehen sollte

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

Fix zeigen ist ziemlich viel bekommen die DataContext durch.

<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> 

gleiche Problem gilt für ContentTemplate aber Template funktioniert gut (Es verwendet ein ControlTemplate)

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

Dies löst das Problem aber sicher muss es eine elegantere Ansatz als das, was ich getan habe? Wäre es besser, stattdessen den DataContext im Resource Dictionary zu deklarieren? Vielen Dank! – Dave

+4

@DaveRook Das Abrufen des DataContext über eine RelativeSource-Bindung ist nicht schlecht, wenn Sie wissen, was Sie tun. Wenn Sie jedoch nach meiner persönlichen Meinung fragen, würde ich das auch nicht tun. Konzept der Ressourcenverzeichnis ist für uns die Kontrolle des wiederzuverwenden, aber wenn wir die in der Ressource-Wörterbuch Bindung Sie haben im Grunde die 'Style' bis auf eine ganz bestimmte VM & View gebunden, das bedeutet, dass Sie vielleicht besser dran gewesen, es im Item definieren selbst direkt. – Viv

+0

Wow, Viv, danke. Beers auf mich dafür. Ja, ich kann verstehen, warum Sie diesen Ansatz gewählt haben, das ist wirklich exzellent und eine enorme Hilfe. – Dave

Verwandte Themen