2013-01-02 154 views
5

我有以下MainWindow,其中列出了左側導航面板和右側顯示區域(這兩個都是UserControls)。WPF:設置UserControl DataContext

有人能解釋如何分配導航面板(LinksView.xaml)到的LinksViewModel.csDataContext。我想將一個命令(BtnCompanyClickCommand)綁定到該按鈕並在LinksViewModel.cs中定義BtnCompanyClickCommand

我已經嘗試過在StackOVerflow上設置DataContext的各種方法,但這些解決方案似乎都不起作用(綁定RelativeSource,命名視圖和綁定到名稱等)。

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> 

編輯

所以我終於碰到這個explanation如何設置其必須在用戶控件的第一個子項目做了用戶控件的DataContext的來了。

這是修改後的LinksView.xaml。

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

不過,我仍然對我爲什麼要設置子元素的DataContext的,而不是用戶控件以及爲什麼DataTemplate中的LinksView(在FormsDictionary.xaml設定)不扎入的DataContext不明確LinksViewModel。任何解釋將不勝感激。

+0

如果您刪除您在編輯中添加的DataContext片段,它仍然有效嗎?我假設你將在這個場景中設置MainWindow視圖的datacontext。 –

+0

如果我從我的編輯中刪除 ...,那麼LinksView有一個MainWindowViewModel的DataContext。 – BrianKE

+0

如果在LinksView上沒有設置datacontext顯式,WPF將遍歷樹尋找一個 - 在你的情況下,在MainWindow上的datacontext。 –

回答

0

首先你必須在你的XAML代碼中引用你的DataContext(LinksViewModel.cs)。 您可以通過直接實例化或使用ResourceDictionary來實現。在後一種情況下,您可以在一些.cs文件或ResourceDictionary .xaml文件內實例化DataConext,並將其存儲在一個指定的ResourceDictionary中,您可以在其中找到該引用。

其次,您只需將View元素的DataContext屬性(如LinksView.xaml)與相應的DataContext相關聯即可。

這是非常高級的,沒有任何代碼,但這是它背後的基本思想。

+0

謝謝,我明白我必須將DataContext連接到XAML,就像我說過的,我嘗試了關於SO的其他問題上提出的各種解決方案。然而,我不能讓這些與我的應用程序一起工作,所以我希望有人能夠真正推薦一些我可以嘗試的代碼。我沒有嘗試在ResourceDictionary中設置LinksView的DataContext,但沒有奏效。 – BrianKE