我被告知在MVVM中为视图设置DataContext的最佳方法是使用DataTemplate。所以我试图通过使用DataTemplate将MainWindow的DataContext设置为MainWindowViewModel的实例。
我无法弄清楚如何。
我尝试将ResourceDictionary放在各个地方(在App.xaml中,在Window.Resources标记中......)
我google搜索无济于事。这就是我所拥有的......(它不起作用,但在这里它是)
的App.xaml:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Dictionary1.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataTemplateTesting" >
<DataTemplate DataType="{x:Type local:MainViewModel}">
<local:MainWindow/>
</DataTemplate>
</ResourceDictionary>
MainViewModel.cs
namespace DataTemplateTesting
{
public class MainViewModel
{
public MainViewModel() { }
}
}
我做的唯一另一件事就是为MainWindow添加一个DataContextChanged事件的处理程序,这样我就可以看到它是否曾被激活......它没有。
任何想法如何解决这个问题?
编辑: 并不是说这里有什么东西无法生成,但是......这里是MainWindow代码。
MainWindow.xaml
<Window x:Class="DataTemplateTesting.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DataTemplateTesting"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525"
DataContextChanged="Window_DataContextChanged" >
<Grid>
</Grid>
</Window>
MainWindow.xaml.cs
namespace DataTemplateTesting
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
int i = 10; //This line exists solely to put a debug stop on.
}
}
}
答案 0 :(得分:5)
<DataTemplate DataType="{x:Type local:MainViewModel}">
<local:MainWindow/>
</DataTemplate>
首先,此声明并不意味着“创建MainWindow
并将其DataContext
设置为MainViewModel
”。它实际上意味着只要您看到MainViewModel
只是将MainWindow
放在可视树中。
其次,您无法将Window
课作为孩子添加到另一个Visual
。如果您尝试,您将获得例外Window must be the root of the tree. Cannot add Window as a child of Visual
。
正确的方法是这样的:
<Window x:Class="DataTemplateTesting.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DataTemplateTesting"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ContentControl>
<ContentControl.Content>
<local:MainViewModel/>
</ContentControl>
</ContentControl>
</Grid>
在资源字典中定义:
<DataTemplate DataType="{x:Type local:MainViewModel}">
<local:SomeUserControl/>
</DataTemplate>
并创建用户控件:
<UserControl x:Class="DataTemplateTesting.SomeUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TextBox/>
</Grid>
</UserControl>
如果您的内容动态更改或定义了视图的ItemTemplate
,则此功能非常有用。否则,只需手动设置DataContext
Window
。
<Window x:Class="DataTemplateTesting.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DataTemplateTesting"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainViewModel>
</Window.DataContext>
<Grid>
</Grid>