2011-01-18 1 views
3

J'utilise Mvvm-Light et j'ai ignoré le fonctionnement de XAML jusqu'à maintenant.Comment remplacer le DataContext ViewModel pour que je puisse lier des objets dans la Vue (Mvvm-Light)?

Voici mon XAML

<phone:PhoneApplicationPage.Resources> 
</phone:PhoneApplicationPage.Resources> 

<Grid x:Name="LayoutRoot" Background="Transparent"> 

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,14"> 
     <TextBlock x:Name="ApplicationTitle" Text="{Binding SecuritySystemName}" Style="{StaticResource PhoneTextNormalStyle}"/> 
     <TextBlock x:Name="PageTitle" Text="{Binding PageName}" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
    </StackPanel> 

    <TextBlock Name="textCode" 
     DataContext="{WHAT GOES HERE to bind to properties on my View (SecurityPanelPage class)}"  
     Text="{Binding Path=Code}" /> 

</Grid> 

{Reliure SecuritySystemName} et {Reliure PageName} lier correctement à mon ViewModel (SecuirtyPanelViewModel). Mais je veux {Binding Code} dans l'élément TextBlock à lier à mon VIEW (pas ViewModel).

J'ai recherché et recherché des exemples de documentation & qui expliquent la syntaxe et les valeurs supportées par DataContext et Binding. Rien n'a aidé. Tout ce que je veux savoir, c'est comment définir un DataContext (ou spécifier quelque chose dans une {Binding ...} qui pointera vers mon objet View. J'ai essayé "Self" et toutes sortes de "RelativeSource" les choses, mais le travail ne devinette est pas productif car le voyage aller-retour dans le débogueur avant que le XAML est analysé est trop long

Merci

MISE à JOUR -... J'ai trouvé une réponse qui me fait bouger, mais je reste ne pas grok donc j'ai des questions de suivi pour les belles affiches ci-dessous ..

Voici ce qui fonctionne:

<phone:PhoneApplicationPage x:Name="ThisPage"> 
    <TextBlock Name="textCode" Text="{Binding Code, ElementName=ThisPage"/> 
</phone:PhoneApplicationPage> 

J'ai trouvé cette astuce ici: http://bursjootech.blogspot.com/2007/12/bind-from-xaml-to-local-property-in.html

Il a posé la question différemment: comment "Bind de XAML à une propriété locale dans le code-behind".

Je ne comprends toujours pas les deux solutions fournies ci-dessous. Donc plus de questions ci-dessous ...

Répondre

5

En général, lorsque vous utilisez MVVM presque toutes vos propriétés liables sont sur votre ViewModel et non sur vos vues. Cependant, il est évident que vous voulez parfois créer des contrôles de composants qui ont des propriétés. Pouvez-vous expliquer ce que la propriété est et pourquoi elle doit seulement être une propriété sur la vue?

Cela dit ... Je devine votre SecurityPanelPage est la vue du XAML affiché?

Vous pouvez attribuer un nom à votre contrôle, puis utiliser la liaison ElementName. De cette façon, vous n'avez pas besoin de définir le DataContext.

<phone:PhoneApplicationPage 
    x:Name="controlName" 
    x:Class="SomeNamespace.SecurityPanelPage"> 
</phone:PhoneApplicationPage> 

Et puis vos modifications se liant à:

<TextBlock 
    Name="textCode" 
    Text="{Binding Path=Code, ElementName=controlName}" /> 

Pour définir explicitement le DataContext vous pouvez effectuer les opérations suivantes:

<TextBlock 
    Name="textCode" 
    DataContext="{Binding ElementName=controlName}" 
    Text="{Binding Path=Code}" /> 
+0

Ok, quand je lis votre réponse, je ne l'ai pas Grok il. Je pensais que vous proposiez quelque chose de différent et votre échantillon n'était pas complet. Mais maintenant je vois que vous fournissez la même solution que j'ai trouvée ci-dessus. – tig

+0

Permettez-moi de demander un suivi: Dans l'exemple utilisant DataContext, quelle autre syntaxe de DataContext obtiendra à la racine? Je jure que j'ai vu quelque chose avant, mais je ne m'en souviens plus. – tig

+0

Oh, et vous avez raison à propos de ces choses appartenant à mon ViewModel. J'étais fainéant et j'ai été distrait en voulant savoir comment faire. Je déplace maintenant tout le code vers ma machine virtuelle où elle appartient. – tig

1

Si je ne me trompe pas, vous pouvez ajouter des ressources dans votre app.xaml à la vue que vous voulez.

A.E:

xmlns:crap="clr-namespace:Application.Views" 
<Application.Resources> 
    <ResourceDictionary> 
     <crap:MyViewPage x:Key="MyViewPage" /> 
    </ResourceDictionary> 
</Application.Resources> 

alors l'utiliser comme "{Binding MyProperty, source={StaticResource MyViewPage}".

espère que cela fonctionne/aide

+0

Comment faire la même chose en utilisant dans XAML de ma vue. Je ne peux pas comprendre comment définir l'équivalent "xmlns: merde" pour ma vue. – tig

+0

"Application.Views" est le répertoire Views de mon application. Mais je crois, si vous voulez vous lier aux objets dans le xaml, alors la solution de joe mcBride est meilleure –

Questions connexes