2009-10-05 17 views
26

Chcę móc utworzyć instancję obiektu DataContext dla mojego okna StartupUri WPF w XAML, zamiast tworzyć go, a następnie programowo ustawić właściwość DataContext.Jak utworzyć instancję obiektu DataContext w XAML

Głównym powodem jest to, że nie muszę uzyskiwać dostępu do obiektu utworzonego zewnętrznie i nie chcę pisać kodu tylko dla ustawienia DataContext.

Jestem pewien, że czytałem gdzieś, jak instancję obiektu w XAML DataContext, ale nie mogę go znaleźć w żadnym z ich zwykłymi miejscami ...

Odpowiedz

31

możliwość dodania nazw XML niezależnie nazw swoje DataContext mieszka, utworzyć instancję go w oknie i zasobów ustawić DataContext do tego zasobu:

<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

Czy to działa w platformie .NET 4.5? Próbowałem tego kodu i mówi ... 'Nie znaleziono typu" local: MyViewModel ". Sprawdź, czy nie brakuje Ci zespołu i czy zostały utworzone wszystkie zbiory referencyjne. " –

+0

@RafafTahsin czy upewniłeś się, że masz poprawnie przestrzeń nazw? Ponadto, jeśli dodałeś do projektu typ odniesienia, ale jeszcze go nie zbudowałeś, projektant WPF trochę się pomyli. Czy próbowałeś budować? – Randolpho

27

można tylko określić to bezpośrednio w XAML dla całego okna:

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

Spowoduje to utworzenie modelu widoku o nazwie "CustomViewModel" w przestrzeni nazw aliasowanej na lokalny, bezpośrednio jako obiekt DataContext dla okna.

15

Zakładając ten kod:

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

Spróbuj tego:

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

Powodzenia!

+1

+1, ponieważ pokazuje on zarówno działanie, jak i designtime, i nie korzysta z klucza x: Key, ale zamiast tego umieszcza obiekt DataContext bezpośrednio w elemencie, do którego należy. – stijn

0

Jeśli trzeba ustawić DataContext w tej samej klasie kontrolnej:

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

użycie wiążące RelativeSource.

lub po prostu

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

Jeśli chcesz przypisać instancję innej klasy niż on sam.

Powiązane problemy