2013-01-02 14 views
5

Ho il seguente MainWindow che espone un pannello di navigazione sul lato sinistro e un'area di visualizzazione sul lato destro (entrambi sono UserControls).WPF: Set UserControl DataContext

Qualcuno può spiegare come assegnare il DataContext del pannello di navigazione (LinksView.xaml) a quello di LinksViewModel.cs. Vorrei associare un comando (BtnCompanyClickCommand) al pulsante e definire BtnCompanyClickCommand in LinksViewModel.cs.

Ho provato vari metodi che ho trovato su StackOVerflow per impostare DataContext ma nessuna di queste soluzioni sembra funzionare (associazione RelativeSource, vista di denominazione e associazione al nome, ecc.).

MainWindow.xaml

<StackPanel Orientation="Horizontal"> 
    <vw:LinksView DataContext="{Binding RelativeSource={RelativeSource Self}}"/> 
    <ContentControl Content="{Binding CurrentUserControl}" /> 

</StackPanel> 

LinksView.xaml

<StackPanel Orientation="Vertical"> 
    <Button Content="Company" Width="75" Margin="3" Command="{Binding ElementName=Links,Path=BtnCompanyClickCommand}" /> 
</StackPanel> 

FormsDictionary.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:vm="clr-namespace:SidekickAdmin.ViewModel" 
        xmlns:vw="clr-namespace:SidekickAdmin.View"> 

    <DataTemplate DataType="{x:Type vm:CompanySummaryViewModel}"> 
     <vw:CompanySummaryView> 
      <ContentControl Content="{Binding }" /> 
     </vw:CompanySummaryView> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:LinksViewModel}"> 
     <vw:LinksView /> 
    </DataTemplate> 

</ResourceDictionary> 

EDIT

Così ho finalmente sono imbattuto in questo explanation di come impostare il DataContext di un UserControl, che deve essere fatto sul primo punto del bambino di UserControl.

Ecco il LinkView.xaml modificato che funziona.

<StackPanel Orientation="Vertical"> 
    <StackPanel.DataContext> 
     <vm:LinksViewModel /> <!-- Bind the items in StackPanel to LinksViewModel --> 
    </StackPanel.DataContext> 

    <Button Content="Company" Width="75" Margin="3" Command="{Binding BtnCompanyClickCommand}" /> 
</StackPanel> 

Tuttavia, sono ancora non chiare sul perché devo impostare il DataContext dell'elemento bambino e non l'UserControl e perché il DataTemplate per Linksview (impostato in FormsDictionary.xaml) non vincola in DataContext di LinksViewModel. Qualsiasi spiegazione sarebbe apprezzata.

+0

Funziona ancora se rimuovi il pezzo DataContext che hai aggiunto alla tua modifica? Immagino che avrai il set di dati della vista MainWindow in questo scenario. –

+0

Se rimuovo ... dalla mia modifica, LinksView ha un DataContext di MainWindowViewModel. – BrianKE

+0

Se sul LinksView non esiste un'impostazione esplicita di datacontext, WPF salterà l'albero alla ricerca di uno - nel tuo caso il datacontext su MainWindow. –

risposta

0

Prima di tutto devi fare riferimento al tuo DataContext (LinksViewModel.cs) nel tuo codice XAML. Puoi farlo sia istanziandolo direttamente o usando un ResourceDictionary. In quest'ultimo caso istanziate il vostro DataConext all'interno di qualche file .cs o all'interno del file .xaml ResourceDictionary e memorizzatelo in un ResourceDictionary denominato dove potete trovare il riferimento in seguito.

In secondo luogo è sufficiente associare la proprietà DataContext di un elemento View come LinksView.xaml con il DataContext corrispondente.

Questo è piuttosto di alto livello e senza alcun codice ma questa è l'idea alla base.

+0

Grazie, ho capito che devo connettere DataContext allo XAML e come ho detto ho provato varie soluzioni proposte su altre domande su SO. Tuttavia, non riesco a far funzionare questi con la mia applicazione, quindi speravo che qualcuno potesse suggerire un codice che potrei provare.Ho provato a impostare il DataContext del LinksView nel ResourceDictionary ma non ha funzionato. – BrianKE