2014-09-15 3 views
1

Для нового проекта мне недавно было предложено исследовать метод привязки информации, связанной с отображением пользовательского интерфейса, к бизнес-объектам в приложении WPF. Например, класс отчета:Определение свойств пользовательского интерфейса с использованием атрибутов

class ExecutionReport 
{ 
    [Displayable(Bold, Background=Color.Red)] 
    public String OrderId{get; private set;} 

    [Displayable(Normal, HAlignment=Center)] 
    public String Symbol {get; private set;} 

    // this should be hidden as it doesn't have DisplayableAttribute 
    public String ClientOrderId {get; private set;}] 

    [Displayable(Normal, HAlignment=Right, 
     Format("If [Position] < 0 then Background=Color.Red"), 
     Format("If [Position] > 0 then Background=Color.Lime"), 
     DisplayFormat("+#;-#;0")] 
    public Int Position {get; private set;} 
} 

Это совершенно новый подход для меня, как правило, в большинстве МОФ MVVM приложений я работал там было четкое разделение представления и ViewModel и я стараюсь как можно больше чтобы сохранить пользовательские пользовательские данные из виртуальной машины. Вместо этого я склоняюсь к написанию этого, используя ресурсные словари и простые конвертеры, применяемые к связям в слое представления.

Мои вопросы: Существуют ли какие-либо wpf/mvvm-рамки, которые используют этот вид реализации? Если так, мне любопытно посмотреть, как это будет достигнуто.

Есть ли очевидные подводные камни? Первые несколько вещей, которые приходят на мой взгляд, являются

  • Изменение уведомления (то есть. INotifyPropertyChanged, чтобы вызвать обновление зрения). Будет ли реализация этого намного сложнее?

  • Сложность в возможности использовать ресурсные словари для системных значений. Например, возможно, я хотел изменить цвет красного цвета, используемый во всем приложении. Я бы Ctrl + F через и найти все места в бизнес-объектах, где он был использован, и изменить его, вместо того, чтобы быть в состоянии изменить единый StaticResource

  • Невозможность использовать DesignTime DataContexts

  • Performance. Кажется, любит это требует интенсивного использования отражения, которое не может быть столь же производительным как типичные конвертеры значений

Я очень заинтересован, чтобы увидеть, если я правильно на второй и третьей точек или если обе эти вещи все еще может быть достигнуто?

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

ответ

1

Этот подход очень популярен и называется аспектно-ориентированным программированием (ASP.NET MVC использует его много). Наиболее популярной библиотекой для написания этой статьи является PostSharp (см. Примерные примеры клиентов, есть некоторые компании, которые использовали ее для WPF). Самое лучшее в PostSharp заключается в том, что использует компиляцию во времени.

Для первой точки: PostSharp получил хорошо протестирован NotifyPropertyChanged аспект, вы можете добавить [NotifyPropertyChanged] атрибут класс и все свойства будут называть PropertyChanged, когда значение получает изменилось.

Для второго пункта: вы всегда можете сделать свой атрибут для поиска StaticResources и передать ключ ресурса в атрибуте.

Для третьего (хотя я не уверен на 100% о нем) и четвёртой точке: времени компиляции ткачество означает, что аспект «прилагается» к коду на компиляции - как вы написали бы его внутри метода/свойства к которому вы добавили атрибут. Это похоже на компилятор пост-сборки и не использует отражение (если аспект, который вы написали, не использует отражение), так что производительность действительно хорошая.

Однако в примере, который вы указали, я бы предпочел пойти с преобразователями ценности и стилями, такими как @AwkwardCoder, - но аспекты (атрибуты) также полезны, например, для «представления»: они отлично подходят для проверки.

+0

AOP поддерживает отладку или все они сотканы после компиляции? – AwkwardCoder

+0

@AwkwardCoder кажется, что вы можете это сделать: http://doc.postsharp.net/debugging – fex

3

IMO это похоже на ужасную идею, все они кажутся примерами, которые должны быть реализованы как XAML-преобразователи.

Все перечисленные пункты, по-видимому, являются вескими причинами, чтобы избежать этого.

Примечание. В структуре есть набор атрибутов, которые предоставляют некоторые функции пользовательского интерфейса (очень ограниченные), см. Пространство имен System.ComponentModel.DataAnnotations.

1

Я согласен, что это кажется ужасной идеей, и ваш комментарий ...

в большинстве приложений WPF MVVM Я работал там было четкое разделения вида и ViewModel и я стремлюсь как можно больше , чтобы сохранить пользовательские данные из виртуальной машины. Вместо этого я склоняюсь в сторону написания это с помощью словарей ресурсов и простых преобразователей , применяемых на переплетах в слое просмотра

... Я думаю, подводит итог, почему и как избежать этого.

Связывание ваших бизнес-объектов с деталями реализации, такими как цвет, горизонтальное выравнивание или положение, похоже на краткосрочную победу (но долгосрочный ад).

+0

«похоже на краткосрочную победу (но долгий ад)». это точно... – AwkwardCoder

Смежные вопросы