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