2016-08-19 1 views
0

J'ai une application de bureau wpf. J'utilise la grille de données et je remplis ma grille à l'aide d'une architecture de vue-modèle. J'ai également un bouton pour chaque rangée.comment définir le chemin de liaison explicitement

J'ai lié un bouton (essayé) à un objet de commande.

Donc.

Cette mon MVVM:

public class Navigation 
{ 
    private ICommand _ViewJobAction; 
    public ICommand ViewJobAction 
    { 
     get 
     { 
      try 
      { 
       if (_ViewJobAction == null) 
       { 
        _ViewJobAction = new MyCommand(
          param => ViewJob() 
        ); 
       } 
       return _ViewJobAction; 
      } 
      catch (Exception ex) 
      { 
       //handle error 
      } 
      return null; 
     } 
    } 
    private void ViewJob() 
    { 
     //do some stuff 
    } 

    private Customers _CustomerRecords; 
    public Customers CustomerRecords 
    { 
     get 
     { 
      return _CustomerRecords; 
     } 
     set 
     { 
      _CustomerRecords = value; RaisePropertyChanged("CustomerRecords"); 
     } 
    } 
} 

public class Customers 
{ 
    //get data 
} 

à mon avis:

<DataGrid "{Binding Navigation.CustomerRecords.Records}"> 
    //defined columns 
    <DataGridTemplateColumn.CellTemplate> 
     <DataGridTemplateColumn> 
      <Button Command="{Binding Navigation.ViewJobAction ,UpdateSourceTrigger=Explicit}" Content="View Job"> 
         </Button> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 

Cela n'appelle pas mon commandement dans ma VM.

Dans la fenêtre de sortie, j'obtiens ceci:

System.Windows.Data Error: 40 : BindingExpression path error: 'Navigation' property not found on 'object' ''CustomerRecord' (HashCode=26023080)'. BindingExpression:Path=Navigation.ViewJobAction; DataItem='CustomerRecord' (HashCode=26023080); target element is 'Button' (target property is 'Command' (type 'ICommand') 

Maintenant, je pense que je comprends cette erreur mais je ne sais pas comment le résoudre en dehors de déplacer le code viewAction à la classe client que je ne veux pas faire.

Ma dernière tentative pour obtenir ce travail a été de mettre l'option explicite » dans.

aide?

Répondre

1

Vous pouvez régler la RelativeSource de la liaison pour pointer vers le DataGrid, puis se lier à une propriété de son DataContext:

<Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.ViewJobAction, UpdateSourceTrigger=Explicit}" 
     Content="View Job" /> 
+0

Merci Andy, il était logique. :) –