Привязка данных, когда объектам модели не хватает некоторых свойств - PullRequest
0 голосов
/ 20 февраля 2012

В сценарии MVVM модель Impegni создается из таблицы базы данных с использованием linq2sql.Форма Wpf отображает все поля «Impegni», и это достигается связыванием объекта, представленного моделью представления ImpegnoSelezionato типа «Impegni», с DataContext сетки, которая содержит все другие элементы управления пользовательского интерфейса.К сожалению, в форме необходимо отобразить еще несколько полей, и часть из них может быть непосредственно получена из модели (например, одно из них - логическое сравнение между двумя полями модели).Первое решение состоит в том, чтобы выставить другие свойства в модели представления.Из-за DataContext, установленного в Grid, каждому новому элементу управления, который показывает добавленные свойства в модели представления, нужно что-то вроде:

DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=  {x:Type Window}}, Path=DataContext.ActiveWorkspace}"

, что является для меня очень странным синтаксисом, и я не могу поверить, что нет ничего прощеuse.

Вторая идея, которая у меня возникла, - создать несколько расширений методов для модели Impegni.Этим методам не понадобится какой-либо параметр, и они будут эквивалентны методам получения свойств.
После некоторой работы в сети кажется, что единственный способ привязать элемент управления к методу вместо свойства - это использовать ObjectDataProvider, и я не смогуне узнать, что написать в ObjectType = "{x: Type ??} '

Третья идея состоит в том, чтобы обновить модель с некоторыми дополнительными свойствами, но, как я уже говорил, она поступает из базы данных dfatabase.таблица с использованием linq2sql: я новичок, и я не знаю, смогу ли я добавить дополнительные поля, которых нет в таблице базы данных.

Так что на момент написания статьи работала только первая идеяно я бы хотел что-нибудь чище. Есть предложения?

Спасибо, Филиппо

Ответы [ 3 ]

1 голос
/ 21 февраля 2012

Вы можете укоротить эту привязку, немного нечисто.

Оригинал:

{Binding RelativeSource={RelativeSource Mode=FindAncestor,
                                        AncestorType={x:Type Window}},
         Path=DataContext.ActiveWorkspace}

Минимум:

{Binding DataContext.ActiveWorkspace,
         RelativeSource={RelativeSource AncestorType=Window}}

Это делает несколько вещей:

  1. Использовать конструкторы расширения разметки.Первый безымянный аргумент передается в качестве параметра конструктора в привязке , которая является путем , поэтому Path= можно отбросить.
  2. Использовать неявное преобразование в Type.Так как свойство AncestorType уже имеет тип Type, x:Type является избыточным
  3. Удалять свойства, которые устанавливаются неявно, в этом случае установка AncestorType также устанавливает Mode в FindAncestor,(Вы также можете использовать конструктор, чтобы уронить Mode=, кстати)
0 голосов
/ 21 февраля 2012

Для третьей идеи я нашел этот полезный пост: Как правильно добавить вычисляемое во время выполнения непостоянное свойство только для чтения к классу данных LinqToSQL Я могу легко добавить свойства, которые я пропустил, к модели, так что это решение - самое чистое, что я могу себе представить

0 голосов
/ 20 февраля 2012

Типичным решением для привязки к «производным» значениям модели будет использование MultiBinding s в сочетании с многозначными преобразователями ( IMultiValueConverter ).

...