我希望能够在XAML中为我的WPF StartupUri窗口创建DataContext
对象的实例,而不是创建代码,然后以编程方式设置DataContext
属性。
主要原因是我不需要访问外部创建的对象,我不想仅仅为了设置DataContext
而编写代码。
我确定我已经在某处读过如何在XAML中实例化DataContext
对象,但我无法在任何常见的地方找到它......
答案 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>
如果想要分配不同于自身的类的实例。