2016-04-08 13 views
6

Jak określić DataContext określonego sterowania w czasie projektowania w aplikacji WPF?Określenie danych Kontekst formantu WPF w czasie projektowania

DataContext może być szczegółowo określone w XAML, odziedziczone lub ustawić gdzieś w kodzie i czasami trudno jest zorientować się w czasie projektowania, która klasa powiązania na myśli.

Zazwyczaj staram się znaleźć klasę DataContext w celu wyszukania nazwy powiązania w VS. Na przykład widzę wiązanie jest coś takiego jak

ItemSource = {Binding Items} 

... będę szukać tekstu „elementy”, aby dostać się do tej klasy, lecz VS czasami nie można odnaleźć szukane tekst (Mam kilka projektów w rozwiązanie).

+1

Nie sądzę, że istnieje na to ostateczna odpowiedź, ponieważ nie jest znana w czasie projektowania. Kilka opcji w czasie wykonywania to: a) ustawienie nieprawidłowego powiązania i sprawdzenie danych wyjściowych - może to spowodować błąd mówiący, że właściwość nie została znaleziona na obiekcie b) dodać coś takiego jak "", ale to będzie wyświetlało nazwę klasy tylko wtedy, gdy nie ma skojarzonej DataTemplate lub c) tylko dłuższy sposób wyszukiwania nazwy klasy View, aby zobaczyć, jak jest inicjowany – Tone

Odpowiedz

1

DataContext z Control jest ViewModel. Tak więc istnieje wiele sposobów, aby ustawić ViewModel dla DataContext z View, a jeśli okaże się swoją ViewModel, ale nie ma Items nieruchomość w ViewModel, oznacza to, że należy dodać taką właściwość, aby dostać pracę wiążące.

Polecam również, aby zobaczyć okno Debug->Windows->Output, w którym można zobaczyć informacje o wiązaniu. To znaczy, że możesz znać wiążące błędy.

Kończąc, chciałbym pokazać sposoby ustawiania ViewModel do DataContext:

Istnieje wiele sposobów, aby ustawić DataContext:

Pierwsze podejście. W świetle:

<Window.DataContext> 
    <local:MainWindowViewModel/> 
</Window.DataContext> 

Drugie podejście. powinny przesłonić OnStartUp() metodę App.xaml.cs

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
      base.OnStartup(e); 
      MainWindow app = new MainWindow(); 
      ProductViewModel context = new ProductViewModel(); 
      app.DataContext = context; 
      app.Show(); 
    } 
} 

Trzecie podejście. W konstruktor Windows:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
      InitializeComponent(); 
      DataContext=new MainWindowViewModel(); 
    } 
} 

Czwarte podejście. Można ustawić DataContext przez DependencyInjection przez UnityContainer lub inny kontener IoC. Ale DependencyInjection, Prism i UnityContainer to inne pytania i wychodzi z tego zakresu pytania.Wystarczy na przykład:

protected override void RegisterTypes() 
{ 
    unityContainer.RegisterType<object, ItemControl>("ModuleAUpper"); 
    unityContainer.RegisterType<IViewModelItemControl, ViewModelItemControl>(); 
    unityContainer.RegisterTypeForNavigation<ItemControl>(); 
} 
+0

Debugowanie-> Windows-> Wyjście jest prawdopodobnie wykonalnym rozwiązaniem. Znam sposoby ustawiania DataContext (tutaj jest ustawiana przez innych programistów, które po prostu chcę wymyślić najłatwiej) – Nuts

+0

@ user2143213 nie krępuj się zadawać pytania. Jeśli uważasz, że moja odpowiedź ci pomaga, możesz oznaczyć moją odpowiedź jako odpowiedź, aby uprościć przyszłe poszukiwania innych osób. Przeczytaj ten http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

2

Chciałbym dodać podejście do StepUp's wykazie:

Instancja design:

Tak jak można określić kontekst danych w czasie run, ty można dodać kontekst danych, który jest specyficzny dla czasu projektowania poprzez:

<Usercontrol x:Class="MyUserControl" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:viewModels="clr-namespace:MyProject.ViewModels" 
        d:DataContext="{d:DesignInstance viewModels:MyViewModel}" 
        d:DesignHeight="300" 
        d:DesignWidth="600" 
        mc:Ignorable="d"> 
    </UserControl> 

W Visual Studio można następnie użyć IntelliSense do powiązania właściwości i jeśli twój model widoku ma nieskomplikowany lub nawet nieparametryczny konstruktor, zostanie utworzony w programie Designer i można przetestować wyzwalacz lub konwertery bez konieczności uruchamiania aplikacji.

Powiązane problemy