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