Как создать экземпляр объекта DataContext в XAML

Я хочу иметь возможность создать экземпляр DataContext объект для моего окна WPF StartupUri в XAML, в отличие от создания его кода, а затем установки DataContext собственность programmaticly.

основная причина в том, что мне не нужно обращаться к объекту, созданному извне, и я не хочу писать код только для установки DataContext.

Я уверен, что где-то читал, как создать экземпляр DataContext объект в XAML, но я не могу найти его ни в одном из обычных места...

4 ответов


вы добавляете пространство имен XML для любого пространства имен, в котором живет ваш DataContext, создаете его экземпляр в ресурсах окна и устанавливаете 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>

вы можете просто указать это непосредственно в XAML для всего окна:

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

это создает модель представления с именем "CustomViewModel" в пространстве имен с псевдонимами local, непосредственно как DataContext для окна.


предполагая, что этот код:

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}" />

удачи!


Если вам нужно установить 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>

если вы хотите назначить экземпляр другого класса, чем он сам.