我有以下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。 –