2009-10-05 4 views
26

Ich mag im Gegensatz zu der Lage sein, eine Instanz des DataContext Objekts für meine WPF StartupUri Fenster in XAML zu erstellen, um es Code erstellen und dann programmaticly die DataContext Eigenschaft festlegen.Wie Datacontext-Objekt in XAML instanziiert

Der Hauptgrund ist, dass ich nicht auf das extern erstellte Objekt zugreifen muss und ich möchte Code nicht hinterher schreiben müssen nur für die Einstellung der DataContext.

Ich bin sicher, dass ich irgendwo gelesen habe, wie die DataContext Objekt in XAML instanziiert, aber ich kann es nicht in einem der üblichen Plätzen finden ...

Antwort

31

Sie einen XML-Namespace für was auch immer Namespace fügen Sie Ihre Datacontext lebt in, eine Instanz davon im Fenster Ressourcen erstellen und die Datacontext auf diese Ressource gesetzt:

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

Funktioniert das in .NET Framework 4.5? Ich habe diesen Code ausprobiert und es heißt ... 'Der Typ 'local: MyViewModel' wurde nicht gefunden. Stellen Sie sicher, dass keine Assembly fehlt und alle referenzierten Assemblys erstellt wurden. –

+0

@RafafTahsin Haben Sie sichergestellt, dass der Namespace korrekt ist? Wenn Sie den referenzierten Typ zum Projekt hinzugefügt, aber noch nicht erstellt haben, wird der WPF-Designer ein wenig verwirrt. Hast du versucht zu bauen? – Randolpho

27

Sie können dies nur direkt für das gesamte Fenster in XAML angeben:

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

Dadurch wird ein View-Modell mit dem Namen "CustomViewModel" im Namespace aliased für local direkt als DataContext für das Fenster erstellt.

15

Unter der Annahme, diesen Code:

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

Try this:

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

Best of luck!

+1

+1, da dies sowohl run als auch designtime anzeigt und nicht den Schlüssel x: verwendet, sondern den DataContext direkt in dem Element platziert, zu dem er gehört – stijn

0

Wenn Sie die Datacontext als gleiche Steuerklasse setzen:

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

Verwendung Relative Bindung.

oder nur

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

Wenn als sich eine Instanz von anderen Klasse zuordnen wollen.