WPF DataContext вопросы - PullRequest
       5

WPF DataContext вопросы

1 голос
/ 18 августа 2011

Я спросил о том, как он работает с интерфейсом INotifyPropertyChanged ( Как работает WPF INotifyPropertyChanged? ), и он требует, чтобы я связал DataContext XAML с экземплярами INotifyPropertyChanged следующим образом.

MainViewModel model = new MainViewModel();        
this.DataContext = model;

И я также нашел рекомендацию иметь комментарий для DataContext, который использует каждый XMAL (http://joshsmithonwpf.wordpress.com/2009/10/24/xaml-tip-datacontext-comment/).

Когда у меня несколько файлов XAML и я хочу связать DataContext сразные ViewModel, я думаю, мне нужно, чтобы каждый файл XAML.CS содержал этот код (модель варьируется для каждого xaml.cs): this.DataContext = model;.

  • Это правильно?
  • Как я могу сделать то же самое в файле XAML?
  • В чем волшебство этой вещи DataContext?Я имею в виду, как работает DataContext?

Ответы [ 3 ]

2 голосов
/ 18 августа 2011

DataContext действительно является одним из основных ключей к системе привязки в WPF. Когда вы проектируете свое представление (XAML), вы настраиваете привязки данных, но все они выполняются по имени (фактически, в виде строки). «Ближайший» DataContext вверх по визуальной иерархии - это объект, который WPF использует, чтобы найти соответствующее свойство (по имени) и связать привязку.

Предложение размещения комментария является хорошим - оно помогает, потому что выбранные имена действительно зависят от ViewModel (DataContext), поэтому XAML-файл View действительно привязан к определенному типу DataContext.

Обратите также внимание, что существуют другие подходы для подключения DataContext, кроме установки его в коде, включая использование локаторов, шаблонов данных, установку его непосредственно в XAML и т. Д.

1 голос
/ 18 августа 2011
  • Да, насколько я знаю, это правильно, поскольку это довольно повторяющееся, некоторые фреймворки MVVM делают эту ссылку для вас.

  • В XAML:

    <UserControl ...
                 xmlns:vm="clr-namespace:MyApp.ViewModels">
        <UserControl.DataContext>
            <vm:MyViewModel />
        </UserControl.DataContext>
        <!-- ... -->
    </UserControl>
    
  • Включает короткие привязки, где путь относится к DataContext, например, {Binding Name} привязывается к DataContext.Name.Он также наследуется, что может быть полезно.

Пожалуйста, прочитайте Обзор привязки данных , если у вас его нет.

0 голосов
/ 16 февраля 2017

1 - Интерфейс INotifyPropertyChanged обновляет изменения свойств в пользовательском интерфейсе,

публичное событие PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
    }
}

2 - Мы можем использовать два способа установки контекста данных дляview, один вариант - установить контекст в коде позади файла, но это тесно связано с представлением и это не очень хороший подход, я бы предложил вариант ниже, он слабо связан с представлением

<UserControl ...
         xmlns:vm="clr-namespace:MyApp.ViewModels">
<UserControl.DataContext>
    <vm:MyViewModel />
</UserControl.DataContext>
<!-- ... -->

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...