如何使用DataTemplate设置DataContext

时间:2015-11-05 17:01:20

标签: wpf data-binding datatemplate datacontext

我被告知在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.
        }
    }
}

1 个答案:

答案 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>