如何在XAML中实例化DataContext对象

时间:2009-10-05 18:36:21

标签: c# wpf xaml datacontext

我希望能够在XAML中为我的WPF StartupUri窗口创建DataContext对象的实例,而不是创建代码,然后以编程方式设置DataContext属性。

主要原因是我不需要访问外部创建的对象,我不想仅仅为了设置DataContext而编写代码。

我确定我已经在某处读过如何在XAML中实例化DataContext对象,但我无法在任何常见的地方找到它......

4 个答案:

答案 0 :(得分:32)

为DataContext所在的任何命名空间添加XML命名空间,在Window Resources中创建它的实例,并将DataContext设置为该资源:

<Window x:Class="WpfApplication4.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication4"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <local:MyViewModel x:Key="MyViewModel"/>
    </Window.Resources>
    <Grid DataContext="{StaticResource MyViewModel}">

    </Grid>
</Window>

答案 1 :(得分:28)

您可以直接在XAML中为整个Window指定:

<Window 
    ... xmlns definitions ...
>
   <Window.DataContext>
        <local:CustomViewModel />
   </Window.DataContext>
</Window>

这将在别名为local的命名空间中创建一个名为“CustomViewModel”的视图模型,直接作为Window的DataContext。

答案 2 :(得分:15)

假设这段代码:

public abstract class BaseView { }
public class RuntimeView : BaseView { }
public class DesigntimeView : BaseView { }

试试这个:

<Page.DataContext>
    <local:RuntimeView />
</Page.DataContext>
<d:Page.DataContext>
    <local:DesigntimeView />
</d:Page.DataContext>
<ListBox ItemsSource="{Binding}" />

祝你好运!

答案 3 :(得分:0)

如果需要将DataContext设置为相同的控件类:

    <Window x:Class="TabControl.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
            xmlns:local="clr-namespace:TabControl"
            Title="MainWindow" Height="350" Width="525"
            DataContext="{Binding RelativeSource={RelativeSource Self}}"        
            >
</Window>

使用RelativeSource绑定。

或只是

     <Window x:Class="TabControl.MainWindow"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
                xmlns:local="clr-namespace:TabControl"
                Title="MainWindow" Height="350" Width="525"                        
                >
<Window.DataContext>
< new instance of any viewModel here....>
</Window.DataContext>
    </Window>

如果想要分配不同于自身的类的实例。