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

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

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

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

ItemSource = {Binding Items}

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

2 ответов


DataContext of Control is ViewModel. Таким образом, есть много способов установить ViewModel на DataContext of 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 by UnityContainer или другой контейнер МОК. Но!--19-->, Prism и UnityContainer есть другие вопросы и выходит из этой области вопроса. Например:

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

Я хотел бы добавить подход к перечислению StepUps:

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

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

    <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 для связываемых свойств, и если ваша модель представления имеет несложный или даже parameterfree конструктор, он будет создан в конструкторе, и вы можете проверить триггер или преобразователей без необходимости запуска приложения.