web-dev-qa-db-fra.com

Comment instancier un objet DataContext en XAML

Je veux pouvoir créer une instance de l'objet DataContext pour ma fenêtre WPF StartupUri dans XAML, par opposition à la création de code et à la définition par programmation de la propriété DataContext.

La raison principale est que je n'ai pas besoin d'accéder à l'objet créé en externe et que je ne veux pas avoir à écrire de code juste pour définir DataContext.

Je suis sûr d'avoir lu quelque part comment instancier l'objet DataContext en XAML mais je ne le trouve dans aucun des endroits habituels ...

28
Gus Paul

Vous ajoutez un espace de noms XML pour tout espace de noms dans lequel réside votre DataContext, créez une instance de celui-ci dans les ressources de la fenêtre et définissez le DataContext sur cette ressource:

<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>
33
Steven Robbins

Vous pouvez simplement le spécifier directement en XAML pour toute la fenêtre:

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

Cela crée un modèle de vue nommé "CustomViewModel" dans l'espace de noms alias local, directement en tant que DataContext pour la fenêtre.

28
Reed Copsey

En supposant ce code:

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

Essaye ça:

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

Bonne chance!

15
Jerry Nixon

Si vous devez définir le DataContext comme la même classe de contrôle:

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

tilisez la liaison RelativeSource.

ou juste

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

Si vous voulez assigner une instance de classe différente de lui-même.

0
Kylo Ren