2016-04-08 14 views
6

Как определить DataContext конкретного элемента управления во время разработки в приложении WPF?Определить DataContext управления WPF во время разработки

DataContext может быть специально установлено в XAML, наследственные или установить где-то в коде, а иногда это трудно понять во время разработки, какой класс переплеты имеют в виду.

Что я обычно пытаюсь сделать, чтобы найти класс DataContext, - это поиск имени привязки в VS. Например, я вижу связывание это нечто вроде

ItemSource = {Binding Items} 

... Я буду искать текст «Items» для того, чтобы попасть в класс, но VS иногда не удается найти искомый текст (у меня есть несколько проектов в решение).

+1

Я не думаю, что для этого есть окончательный ответ, так как он не известен во время разработки. Несколько вариантов во время выполнения: a) установить недействительную привязку и проверить ваш результат - это может дать вам свойство с ошибкой, не найденное на объекте b) добавить что-то вроде '', но это будет показывать только имя класса, если нет связанного с DataTemplate или c) просто более длинный способ поиска имени класса View, чтобы увидеть, как он инициализируется. – Tone

ответ

1

DataContextControl является ViewModel. Так что существует множество способов установить ViewModel для DataContext из View, и если вы нашли ViewModel, но нет Items собственности в ViewModel, значит это необходимо добавить к объявлению об объекте, чтобы получить привязку к работе.

Кроме того, я рекомендую вам посмотреть окно Debug->Windows->Output, где вы можете просмотреть информацию привязки. То есть вы можете знать ошибки привязки.

В заключение я хотел бы показать способы задания ViewModel к DataContext:

Есть много подходов, чтобы установить DataContext:

Первый подход. Ввиду:

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

Второй подход. Вы должны переопределить OnStartUp() метод 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(); 
    } 
} 

Третий подход. В конструкторе Windows:

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

Четвертый подход. Вы можете установить DataContext через DependencyInjection на UnityContainer или другой контейнер IoC. Но DependencyInjection, Prism и UnityContainer есть другие вопросы и выходит из этой сферы вопроса.Так, например:

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

Debug-> Windows-> Output возможно, является работоспособным решением. Я знаю, как установить DataContext (здесь он задается другими разработчиками, которые я просто хочу найти самым простым способом) – Nuts

+0

@ user2143213 не стесняйтесь задавать любые вопросы. Если вы чувствуете, что мой ответ помогает вам, вы можете отметить мой ответ как ответ, чтобы упростить будущий поиск других людей. Пожалуйста, прочтите это http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – StepUp

2

Я хотел бы добавить подход к StepUp's предложения:

Экземпляр конструкция:

Так же, как вы можете определить контекст данных времени выполнения, вы может добавить контекст данных, который специально для времени разработки с помощью:

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

В Visual Studio вы можете использовать IntelliSense для Привязываемого свойства, и если ваша модель представления имеет несложный или даже конструктор без параметров, она будет создана в конструкторе, и вы можете протестировать триггер или конвертеры без необходимости запуска приложения.