2016-04-08 25 views
6

Come determinare DataContext di un controllo specifico in fase di progettazione in un'applicazione WPF?Determina DataContext di un controllo WPF in fase di progettazione

DataContext potrebbero essere specificamente impostato in XAML, ereditato o impostare da qualche parte nel codice e talvolta è difficile capire che in fase di progettazione classe le associazioni si riferiscono.

Quello che in genere cerco di fare per trovare la classe DataContext è cercare il nome del binding in VS. Per esempio io vedo il legame è qualcosa di simile

ItemSource = {Binding Items} 

... Cercherò il testo "Elementi", al fine di raggiungere la classe, ma VS volte non riesce a trovare il testo cercato (ho diversi progetti in soluzione).

+1

Non penso che ci sia una risposta definitiva per questo, in quanto non è noto in fase di progettazione. Alcune opzioni in fase di esecuzione sono: a) imposta un binding non valido e verifica il tuo output - potrebbe darti un messaggio che dice proprietà non trovata sull'oggetto b) aggiungere qualcosa come '', ma questo mostrerà solo il nome della classe se non ci sono associati DataTemplate o c) solo il modo più lungo di cercare il nome della classe View per vedere come viene inizializzato – Tone

risposta

1

DataContext di Control è ViewModel. Quindi esistono molti modi per impostare ViewModel per DataContext di View e, se si trova il numero ViewModel, ma non c'è la proprietà Items in ViewModel, significa che è necessario aggiungere tale proprietà per ottenere il binding del lavoro.

Inoltre, ti consiglio di vedere la finestra Debug->Windows->Output in cui è possibile visualizzare informazioni vincolanti. Cioè puoi conoscere gli errori vincolanti.

Per concludere, vorrei mostrare modi di impostazione ViewModel-DataContext:

ci sono molti approcci per impostare DataContext:

Il primo approccio. In considerazione:

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

Il secondo approccio. Si dovrebbe ignorare OnStartUp() metodo 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(); 
    } 
} 

Il terzo approccio. In costruttore di Windows:

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

Il quarto approccio. È possibile impostare DataContext tramite DependencyInjection per UnityContainer o un altro contenitore IoC. Ma DependencyInjection, Prism e UnityContainer sono altre domande e vanno da questo ambito della domanda.Basta per esempio:

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

Debug-> Windows-> Output è probabilmente una soluzione praticabile. Conosco i modi per impostare DataContext (qui è impostato da altri sviluppatori che voglio solo capire il modo più semplice) – Nuts

+0

@ user2143213 sentiti libero di fare qualsiasi domanda. Se ritieni che la mia risposta ti sia di aiuto, puoi contrassegnare la mia risposta come una risposta per semplificare la ricerca futura di altre persone. Per favore, leggi questo http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

2

Vorrei aggiungere un approccio alla StepUp's lista:

L'istanza di progettazione:

Proprio come è possibile definire un contesto dati fase di esecuzione, può aggiungere un contesto dati che è specifico per la fase di progettazione tramite:

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

In Visual Studio è possibile utilizzare IntelliSense per bindable proprietà e se il tuo modello di vista ha un costruttore semplice o addirittura privo di parametri, verrà creato nel Designer e potrai testare trigger o convertitori senza dover avviare l'applicazione.