2012-04-09 3 views
1

Ich habe eine DataTemplate, die in eine ResourceDictionary setzen, und es gibt eine Schaltfläche in der DataTemplate und ich legte diese DataTemplate in einem Fenster. Jetzt möchte ich den Button-Befehl an eine Eigenschaft von windowViewModel binden, wie kann ich das tun? Dies ist der Code:Wie bindet man eine Schaltfläche in einem DataTemplate an ein ViewModel?

<DataTemplate DataType="{x:Type types:User}" x:Key="UserTemp"> 
    <Grid > 
     <Button Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ????}, AncestorLevel=1}, Path=SelectLocationCommand}" /> 
    </Grid> 
</DataTemplate> 

und in Window.xaml

<ContentControl x:Name="UserTemp" /> 

und in WindowViewModel:

public ICommand SelectLocationCommand 
    { 
     get {return new RelayCommand(selectLocationCommand); } 
    } 
    void selectLocationCommand() 
    { 
     _welcomeTitle = "AA"; 
    } 

Antwort

2

Die kurze Antwort ist, dass Sie es nicht tun müssen, um in Code.

Sie haben Ihr DataTemplate als Vorlage für ein "Benutzer" -Objekt definiert. Dies bedeutet, dass auf diese Weise ein Benutzerobjekt in der Benutzeroberfläche angezeigt werden soll. Um Ihr DataTemplate zu verwenden, sollten Sie in Ihrem WindowViewModel eine "User" -Instanz haben. Dies bedeutet, dass der SelectLocationCommand im Benutzerobjekt und nicht im WindowViewModel enthalten sein sollte.

, dass alle gesagt haben, Ihr Code aussehen somthing wie diese sollten:

In Window.xaml

<ContentControl Content="{Binding User}" ContentTemplate="{StaticResource UserTemp}" /> 

In WindowViewModel

public User User {get;set} 

Benutzer

public ICommand SelectLocationCommand 
{ 
    get {return new RelayCommand(selectLocationCommand); } 
} 
void selectLocationCommand() 
{ 
    _welcomeTitle = "AA"; 
} 

Stellen Sie außerdem sicher, dass der DataContext von Window.xaml WindowViewModel ist. Es gibt eine Reihe von besseren Möglichkeiten, dies zu tun, aber die einfachste wäre:

In Window.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = new WindowViewModel(); 
} 
+0

dank alex, aber ich mag nicht SelectLocationCommand in der Benutzerklasse setzen !! tatsächlich benutzer die Entitätsklasse! –

+0

Es gibt Lösungen, um den Befehl im übergeordneten ViewModel zu haben, wenn Sie nur ein paar mehr Details über Ihr Design geben könnten, könnte ich Ihnen besser helfen. Wenn Sie sagen, dass der Benutzer tatsächlich die Entity-Klasse ist, meinen Sie, dass das Model ist? – AlexDrenea

+0

danke Alex, es hat eine wirklich einfache Lösung, Sie müssen nur einen Namen für das Fenster und in der dataTemplate bindig, Gibt den Elementnamen in diesem Namen. –

Verwandte Themen