2011-01-04 13 views
79

La domanda dice quasi tutto.Come si imposta ViewModel su una finestra in XAML utilizzando la proprietà DataContext?

Ho una finestra e ho provato a impostare DataContext utilizzando lo spazio dei nomi completo per ViewModel, ma sembra che stia facendo qualcosa di sbagliato.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="BuildAssistantUI.ViewModels.MainViewModel"> 

risposta

90

Oltre alla soluzione che altre persone fornite (che sono buoni, e corretta), c'è un modo per specificare il ViewModel in XAML, ma ancora separare il ViewModel specifica dalla vista. Separarli è utile quando vuoi scrivere casi di test isolati.

In App.xaml:

<Application 
    x:Class="BuildAssistantUI.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:BuildAssistantUI.ViewModels" 
    StartupUri="MainWindow.xaml" 
    > 
    <Application.Resources> 
     <local:MainViewModel x:Key="MainViewModel" /> 
    </Application.Resources> 
</Application> 

In MainWindow.xaml:

<Window x:Class="BuildAssistantUI.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{StaticResource MainViewModel}" 
    /> 
+0

Oh wow ... grazie. Ho già contrassegnato questo come risposta, ma la tua aggiunta è molto apprezzata. Lo userà. – Nicholas

+0

@Nicholas: l'altra risposta è perfetta per la domanda, quindi sono d'accordo con la tua decisione –

+0

poi di nuovo ... il tuo è più completo. Se qualcun altro visita questo post ... – Nicholas

114

Prova questo.

<Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels"> 
    <Window.DataContext> 
     <VM:MainViewModel /> 
    </Window.DataContext> 
</Window> 
+3

Mi piace questa opzione la migliore. Sembra più pulito se la VM viene utilizzata solo per la finestra principale. –

+10

C'è un modo per impostare il contesto dei dati usando un attributo sull'elemento 'Window', come' DataContext = "VM: MainWindowViewModel" '? – Oliver

+0

Questo è il modo corretto! – JavierIEH

7

È necessario creare un'istanza di MainViewModel e impostarlo come datacontext. Nella tua dichiarazione lo consideri solo come valore stringa.

 <Window x:Class="BuildAssistantUI.BuildAssistantWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:BuildAssistantUI.ViewModels"> 
     <Window.DataContext> 
     <local:MainViewModel/> 
     </Window.DataContext> 
+0

Grazie, ho pensato che lo stesse facendo. – Nicholas

3

Si potrebbe desiderare di provare Catel. Ti permette di definire una classe DataWindow (invece di Window), e quella classe crea automaticamente il modello di visualizzazione per te. In questo modo, puoi utilizzare la dichiarazione di ViewModel come hai fatto nel tuo post originale e il modello di visualizzazione verrà comunque creato e impostato come DataContext.

Vedere this article per un esempio.

Problemi correlati