我有以下MainWindow
,其中列出了左側導航面板和右側顯示區域(這兩個都是UserControls
)。WPF:設置UserControl DataContext
有人能解釋如何分配導航面板(LinksView.xaml
)到的LinksViewModel.cs
的DataContext
。我想將一個命令(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。任何解釋將不勝感激。
如果您刪除您在編輯中添加的DataContext片段,它仍然有效嗎?我假設你將在這個場景中設置MainWindow視圖的datacontext。 –
如果我從我的編輯中刪除 ...,那麼LinksView有一個MainWindowViewModel的DataContext。 –
BrianKE
如果在LinksView上沒有設置datacontext顯式,WPF將遍歷樹尋找一個 - 在你的情況下,在MainWindow上的datacontext。 –