How to instantiate DataContext object in XAML

43,127

Solution 1

You add an XML namespace for whatever namespace your DataContext lives in, create an instance of it in the Window Resources and set the DataContext to that resource:

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

Solution 2

You can just specify this directly in XAML for the entire Window:

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

This creates a view model named "CustomViewModel" in the namespace aliased to local, directly as the DataContext for the Window.

Solution 3

Assuming this code:

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

Try this:

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

Best of luck!

Share:
43,127
Gus Paul
Author by

Gus Paul

C#/Windows developer currently working in Manhattan in Financial Services industry. I used to do the same job in London.

Updated on January 22, 2020

Comments

  • Gus Paul
    Gus Paul over 4 years

    I want to be able to create an instance of the DataContext object for my WPF StartupUri window in XAML, as opposed to creating it code and then setting the DataContext property programmaticly.

    The main reason is I don't need to access the object created externally and I don't want to have to write code behind just for setting the DataContext.

    I'm sure I've read somewhere how to instantiate the DataContext object in XAML but I can't find it in any of the usual places...