WPF привязка данных и преобразование типов - PullRequest
4 голосов
/ 06 апреля 2009

У меня есть вопрос относительно связывания WPF и преобразования типов данных, видимых объектами пользовательского интерфейса в XAML.

У меня есть пользовательский элемент управления, который я хотел бы использовать в разных приложениях. Пользовательский элемент управления отображает уменьшенное изображение и несколько текстовых блоков для отображения демографической информации о человеке, такой как имя и адрес. Пользовательский элемент управления используется в проекте MVVM, поэтому он привязан к ViewModel, специфичному для пользовательского элемента управления.

Следуя типичным принципам проектирования MVVM, ViewModel для пользовательского элемента управления часто встраивается в другие ViewModel для создания большего пользовательского интерфейса.

Модель представления пользовательского элемента управления ожидает определенный тип (класс) в качестве объекта привязки. Однако модели ViewModel, в которые встроена виртуальная машина UC, имеют совершенно разные объектные модели, поэтому они не могут просто передавать свои данные в виртуальную машину UC. Необходимо преобразовать модель данных родительской виртуальной машины в модель данных виртуальной машины UC.

У меня такой вопрос: есть ли санкционированный способ выполнить это обращение?

Я посмотрел на IValueConverter и IMultiValueConverter, и они не выглядят так, как надо.

Полагаю, что мне нужно что-то вроде прокладки между родительской виртуальной машиной и встроенной виртуальной машиной UC, где данные родительской виртуальной машины преобразуются в формат, требуемый виртуальной машиной UC.

Или все сводится к тому, что мне приходится писать собственную виртуальную машину UC для обработки любых типов, предоставляемых родительской виртуальной машиной?

Ответы [ 4 ]

2 голосов
/ 20 апреля 2009

Я согласен с Кеном, думаю, у него есть ответ. Если у вас есть много конфигураций ваших данных, которые вы хотите передать в общий пользовательский элемент управления, то вы хотите, чтобы владелец этой конфигурации данных преобразовал их в общую форму, чтобы они были связаны с пользовательским элементом управления.

Каждое представление, использующее элемент управления, будет иметь соответствующую модель представления, предоставляющую свойство в общем формате:

public class SampleViewModel {
   ...

    IUserControlData ControlData 
    { 
       get 
       {
          // Do conversion here or do it early and cache it.
       }
    }

   ...
}

Тогда вы привязали бы это свойство к своему пользовательскому элементу управления в представлении

<common:CommonUserControl DataContext={Binding Path=ControlData} ... >
1 голос
/ 07 апреля 2009

Если родительская виртуальная машина является надмножеством дочерней виртуальной машины, обычно родительская виртуальная машина просто содержит ссылку на дочернюю виртуальную машину. Это предоставило бы эту ссылку как свойство, и вы связали бы ContentControl (или что-то еще) с этим свойством.

Не решит ли это вашу проблему?

0 голосов
/ 08 февраля 2011

Вероятно, не то, что вы ищете, но это решение для динамических столбцов DataGrid. С сеткой данных вы можете передать параметр. http://www.codeproject.com/Articles/36496/Binding-a-Silverlight-DataGrid-to-dynamic-data-Part-2-editable-data-and-INotifyPropertyChanged.aspx

0 голосов
/ 19 апреля 2009

Если вы действительно хотите и нуждаетесь в преобразовании типов, преобразователи значений - это именно то, что вы хотите использовать. При этом тип конверсий, обрабатываемых такими вещами, как IValueConverter, обычно относительно прост и прям.

Если, однако, вашему пользовательскому элементу управления верхнего уровня / родителю / руководству необходимо проанализировать биты и фрагменты более крупного типа для пользовательских элементов управления, в которых размещается его фактическое содержимое, то это задача этого элемента управления верхнего уровня. Не зацикливайтесь на выполнении всего этого в XAML. Совершенно нормально разобрать то, что вам нужно, и установить эти дочерние свойства управления напрямую.

...