J'ai le XAML suivant ci-dessous pour la fenêtre principale de mon application WPF, j'essaie de définir le temps de conception d:DataContext
dessous, ce que je peux faire avec succès pour tous mes divers UserControls, mais cela me donne cette erreur lorsque j'essaie de le faire sur le la fenêtre...
Error 1 The property 'DataContext' must be in the default namespace or in the element namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. Line 8 Position 9. C:\dev\bplus\PMT\src\UI\MainWindow.xaml 8 9 UI
<Window x:Class="BenchmarkPlus.PMT.UI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:UI="clr-namespace:BenchmarkPlus.PMT.UI"
xmlns:Controls="clr-namespace:BenchmarkPlus.PMT.UI.Controls"
d:DataContext="{d:DesignInstance Type=UI:MainViewModel, IsDesignTimeCreatable=True}"
Title="MainWindow" Height="1000" Width="1600" Background="#FF7A7C82">
<Grid>
<!-- Content Here -->
</grid>
</Window>
Wow, quelle douleur! Espérons que MS propose une prise en charge VS au moment de la conception pour x: Bind.
Nous pourrons utiliser le concepteur VS mais aussi pouvoir basculer facilement vers x: Bind au lieu de Binding. Voici ce que j'ai fait:
Dans ma vue, j'ai ajouté une propriété pour obtenir mon ViewModel. Cela est logique car les chemins x: Bind sont relatifs à la page (c'est-à-dire l'objet View).
Dans ma page XAML, j'ai ajouté ce qui suit en
<Page ... >
haut de la XAML:De cette façon, le contexte de données réel de la page est défini sur la page elle-même en raison de la
{x:Bind}
. C'est parce quex:Bind
c'est relatif à la page et il n'y a pas de chemin donné.En même temps, en raison de la
d:DataContext
ligne, le concepteur VS réfléchit sur la classe MyView (sans créer d'instance) aux fins de l'interaction du concepteur VS. Cela permet à VS design de MyView, où vous pouvez ensuite faire défiler jusqu'à la propriété ViewModel, la développer et sélectionner l'élément auquel vous souhaitez vous lier.Lorsque vous faites tout cela, le concepteur VS crée une instruction Binding dont le chemin est relatif à la vue, c'est-à-dire qu'il se trouve être exactement le même que le chemin que x: Bind attend. Donc, si vous souhaitez passer à x: Bind plus tard, vous pouvez simplement rechercher et remplacer tous les "
{Binding
" par "{x:Bind
".Pourquoi avons-nous même besoin de la
d:DataContext
ligne pour dire à VS quelle classe regarder? Bonne question, car vous penseriez que VS pourrait comprendre que la ligne suivante définit le DataContext sur la page, en utilisantDataContext={x:Bind}
. Allez-y et essayez-le, cela ne fonctionne pas et cela ne fonctionne pas non plus si vous changez x: Bind en Binding par rapport à self.Espérons que cette situation sera nettoyée par MS !!
la source