我有以下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>
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如何设置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>
但是,我仍然不清楚为什么我必须设置子元素的DataContext而不是UserControl,以及为什么用于LinksView的DataTemplate(在FormsDictionary.xaml中设置)不与LinksViewModel的DataContext绑定。任何解释都将不胜感激。
答案 0 :(得分:0)
首先,您必须在XAML代码中引用DataContext(LinksViewModel.cs)。 您可以通过直接实例化它或使用ResourceDictionary来实现。在后一种情况下,您可以在某个.cs文件内或在ResourceDictionary .xaml文件中实例化您的DataConext,并将其存储在一个名为ResourceDictionary的文件中,您可以在其中找到该引用。
其次,您只需将ViewView元素的DataContext属性(如LinksView.xaml)与相应的DataContext相关联。
这是非常高级的,没有任何代码,但这是它背后的基本思想。
答案 1 :(得分:0)
MainWindowViewModel中应该有一个LinksViewModel实例:
MainWindowViewModel.cs:
class MainWindowViewModel
{
public MainWindowViewModel()
{
LinksVM = new LinksViewModel();
}
public LinksViewModel LinksVM { get; private set; }
}
MainWindow.xaml
<StackPanel Orientation="Horizontal">
<vw:LinksView DataContext="{Binding LinksVM}"/>
<ContentControl Content="{Binding CurrentUserControl}" />
</StackPanel>
LinksView.xaml
<StackPanel Orientation="Vertical">
<Button Content="Company" Width="75" Margin="3" Command="{Binding BtnCompanyClickCommand}" />
</StackPanel>
由于LinksView是在MainWindow中显式创建的,因此在DataTemplate中不需要-可以将其删除
<DataTemplate DataType="{x:Type vm:LinksViewModel}">
<vw:LinksView />
</DataTemplate>