Frage

Wie kann ich die Datacontext auf meinem Gitter in XAML, statt im Konstruktor?

Hier ist, wie ich es im Konstruktor tun (LayoutRoot ist die XAML Grid in der XAML definiert):

this.LayoutRoot.DataContext = this.HPVM;

Ich würde es vorziehen, sie direkt im XAML zu tun, aber ich weiß nicht, wie das HPVM Objekt in XAML zu verweisen. HPVM ist ein öffentliches Eigentum auf der Usercontrol-Klasse.

Es funktioniert gut, wie oben aufgeführt, aber auch hier, ich will nur wissen, wie man Eigenschaften der Klasse Usercontrol in XAML, anstatt immer es im Code zu tun.

Hier ist alle relevante Code:

  <UserControl x:Class="SilverlightApplication1.SLHolePattern" x:Name="HolePatternsControl"
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"    
    xmlns:controls="clr-namespace:Microsoft.Windows.Controls;assembly=Microsoft.Windows.Controls"
    xmlns:local="clr-namespace:SilverlightApplication1"    
    xmlns:GeoPatterns="clr-namespace:GeoPatterns"
    Height="700">


    <UserControl.Resources>
    ...

Und hier ist mein Konstruktor, wo der Datacontext aktuell eingestellt ist:

namespace SilverlightApplication1
{
    public partial class SLHolePattern : UserControl, INotifyPropertyChanged
    {
        public HolePatternsViewModel HPVM;

        public SLHolePattern()
        {
            InitializeComponent();

            this.HPVM=new HolePatternsViewModel();
            this.LayoutRoot.DataContext = this.HPVM;
            ...more code here
        }

Es funktioniert alles gut, aber ich möchte nur lernen, wie das Datacontext in XAML zu setzen, nicht im Code.

War es hilfreich?

Lösung

Die Antwort Chris gab funktioniert gut. Ich habe getestet und es funktioniert für mich. Sie können Ihre Klasse in XAML (innerhalb der UserControl.Resources) instanziiert und dann binden die Datacontext auf eine statische Ressource.

Folgen Sie den Code ein:


<UserControl ...>
    <UserControl.Resources>
       <myNS:MyClass x:Name="TheContext" x:Key="TheContext"></myNS:MyClass>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheContext}" >
        <TextBlock Text="{Binding Path=Field1}">
        </TextBlock>
    </Grid>
</UserControl>

Andere Tipps

Die folgende Ungeheuerlichkeit arbeitet in Silverlight 4

<UserControl 
  DataContext="{Binding HPVM, RelativeSource={RelativeSource Self}}">
<UserControl.DataContext>
  <vm:ThisUCViewModel />
</UserControl.DataContext>

versuchen, so etwas wie diese .....

<Grid DataContext="{Binding Path=HPVM}">
</Grid>

wo HPVM ist ein öffentliches Mitglied dieser. -> Formular etc

Erstellen Sie die Instanz der Klasse in der XAML, durch so etwas zu Ihren Ressourcen Abschnitt Hinzufügen .... (vergessen Sie nicht Ihren Xmlns Namensraum hinzugefügt werden)

<my:bogart x:Key="franken"/>

dann binden den Datenkontext auf die statische Ressource, die Sie gerade hinzugefügt haben ....

<Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource franken}">
    <TextBox  Background="Red" Foreground="White" Text="{Binding Path=sum}"  />
</Grid>

In Silverlight 4, konnte ich diese Funktion erhalten, indem Sie folgendermaßen vorgehen:

Geben Sie die Seite / Usercontrol ein x: Name = "myPage"

In Ihrer Kontrollbindung Verwendung normalen Element bidning Syntax. In meinem Fall möchte ich für meine Itemssource-Eigenschaft zu einer beobachtbaren Sammlung von Objekten in meinem Code hinter sich binden:

<ComboBox 
    ItemsSource={Binding ElementName=myPage, Path=MyObservableObjectList, Mode=TwoWay}

Ich habe dies mit Datacontext nicht versucht, aber wissen Sie, Element zu Element für Datacontext Bindung tun kann, wie ich dies tun für Grids, deren Kontext basiert auf dem ausgewählten Element aus einem anderen Drop-Down auf der Seite.

Dies ist nicht möglich (Es ist möglich, in WPF mit {Binding RelativeSource={RelativeSource Self}}, aber Silverlight ist begrenzt.

Sie haben es durch den Code zu tun.

<UserControl.Resources>
  <ResourceDictionary>
     <vm:YourModelx:Key="myModel"/>
  </ResourceDictionary>
</UserControl.Resources>
<UserControl.DataContext>
   <Binding Source="{StaticResource myModel}"/>
</UserControl.DataContext>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top