Bri*_*nKE 5 data-binding wpf datacontext button mvvm
我有以下MainWindow列出左侧导航面板和右侧显示区域(这两个都是UserControls).
有人可以解释如何将DataContext导航面板(LinksView.xaml)分配给LinksViewModel.cs.我想绑定的命令(BtnCompanyClickCommand)的按钮并定义BtnCompanyClickCommand在LinksViewModel.cs.
我尝试过在StackOVerflow上找到的各种方法来设置DataContext但这些解决方案似乎都不起作用(绑定RelativeSource,命名视图和绑定到名称等).
MainWindow.xaml
<StackPanel Orientation="Horizontal">
<vw:LinksView DataContext="{Binding RelativeSource={RelativeSource Self}}"/>
<ContentControl Content="{Binding CurrentUserControl}" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
LinksView.xaml
<StackPanel Orientation="Vertical">
<Button Content="Company" Width="75" Margin="3" Command="{Binding ElementName=Links,Path=BtnCompanyClickCommand}" />
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
编辑
所以我终于遇到了如何设置UserControl的DataContext的解释,该控件必须在UserControl的第一个子项上完成.
这是修改后的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>
Run Code Online (Sandbox Code Playgroud)
不过,我仍然不为什么我必须设置子元素的DataContext的,而不是用户控件以及为什么DataTemplate中的LinksView(在FormsDictionary.xaml设定)不扎入LinksViewModel的DataContext的清晰.任何解释将不胜感激.
首先,您必须在 XAML 代码中引用 DataContext (LinksViewModel.cs)。您可以通过直接实例化它或使用 ResourceDictionary 来做到这一点。在后一种情况下,您可以在某个 .cs 文件内或 ResourceDictionary .xaml 文件内实例化 DataConext,并将其存储在命名的 ResourceDictionary 中,稍后您可以在其中找到引用。
其次,您只需将 View 元素(例如 LinksView.xaml)的 DataContext 属性与相应的 DataContext 相关联。
这是相当高级的,没有任何代码,但这就是它背后的基本思想。