Проверьте привязку данных в XAML во время компиляции

Я работаю над базирующимся приложением WPF. Средой является VS2008 SP1 с.NET 3,5 SP 1. В нашей разработке мы используем шаблон MVVM широко.

Т.е. разработчики приложений пишут Модели и ViewModels (C#), тогда разработчики UI запишут Представления с помощью WPF, Связывающего (XAML). Разработчики приложений также пишут модульные тесты сверху ViewModels. Мы используем Непрерывную методологию Интеграции, и мы - сборка diond и выполняющийся модульный тест на каждой модификации

Проблемой является отсутствие процесса или инструменты проверки правильности привязки данных в XAML. Например:

  1. Разработчик приложения пишет свойство NmberOfApples и модульные тесты для проверки его корректного поведения
  2. Разработчик UI создает пользовательский элемент управления, и свяжите его со свойством
  3. Разработчик приложения находит, что свойство имеет орфографическую ошибку, и зафиксируйте ее имя к NumberOfApples
  4. Это были бы ошибки времени компиляции в любом свойстве NmberOfApples использования кода C#, и такие ошибки будет легко зафиксировать (Непрерывная Интеграция)
  5. Привязка данных в файлах XAML не будет проверенной, и это будет ошибка периода выполнения

Мой вопрос будет, “Там какой-либо инструмент или методология, которые помогают нам проверить правильность привязки данных в XAML во время компиляции?”

13
задан db_ 10 December 2009 в 23:21
поделиться

4 ответа

Решение вашей проблемы обсуждается в этой статье .

Основная идея состоит в том, чтобы создать набор статических (c #) классов ViewModel MetaData, содержащих строку значение свойств ваших классов ViewModel, которые затем можно использовать в своем xaml. В статье объясняется, как использовать генерацию текста T4 для создания этих статических классов метаданных. Вы можете использовать любой инструмент генерации кода по вашему выбору.

, чтобы ваша виртуальная машина имела следующее:

namespace Mine
{
  public class MyViewModel
  {
    public int MyInt {get;set;}
   public string MyString {get;set;}  
  }
}

И вы создаете код, создавая это:

namespace Mine.MetaData
{
  public static class MyViewModelMetaData
  {
    public const string MyInt = "MyInt";
    public const string MyString = "MyString";
  }
}

, а затем в своем xaml вы добавляете пространство имен в свой xaml и связываете ваши элементы управления для класса метаданных

<TextBox Text="{Binding Path={x:Static Metadata:MyViewModelMetadata.MyInt}}"/>

. Если вы используете надстройку, например resharper , то она предоставит вам intellisense для свойств статического класса, а также потому, что вы ссылаетесь на точное свойство в статическом классе , когда статический класс регенерируется, ваш xaml не должен компилироваться.

Это довольно гладко, я думаю, что это здорово, и у него есть шанс сохранить рассудок большинству людей, но ваш опыт может отличаться. :)

РЕДАКТИРОВАТЬ:

Между прочим, я не верю, что «модели представления тесно связаны с представлениями». На мой взгляд, представления неразрывно связаны со своими моделями представления, но это должно быть только одним способом. ViewModels должен быть полностью независимым от любой реализации представления. Это как ViewModel - это интерфейс, а View - это конкретный реализованный класс. Поэтому по этой причине я не добавляю никаких свойств, специфичных для WPF (например, перечисление видимости), в мою ViewModel, потому что это обязывает меня использовать WPF вечно (что на самом деле неплохо :)), но это ставит под угрозу обслуживание.

Это довольно здорово, я думаю, что это круто, и у него есть шанс сохранить рассудок большинству людей, но ваш опыт может отличаться. :)

РЕДАКТИРОВАТЬ:

Между прочим, я не верю, что «модели представления тесно связаны с представлениями». На мой взгляд, представления неразрывно связаны со своими моделями представления, но это должно быть только одним способом. ViewModels должен быть полностью независимым от любой реализации представления. Это как ViewModel - это интерфейс, а View - это конкретный реализованный класс. Поэтому по этой причине я не добавляю какие-либо специфические для WPF свойства (например, перечисление видимости) в мою ViewModel, потому что это обязывает меня использовать WPF для вечности (что на самом деле неплохо :)), но это ставит под угрозу обслуживание.

Это довольно здорово, я думаю, что это круто, и у него есть шанс сохранить рассудок большинству людей, но ваш опыт может отличаться. :)

РЕДАКТИРОВАТЬ:

Между прочим, я не верю, что «модели представления тесно связаны с представлениями». На мой взгляд, представления неразрывно связаны со своими моделями представления, но это должно быть только одним способом. ViewModels должен быть полностью независимым от любой реализации представления. Как будто ViewModel - это интерфейс, а View - это конкретный реализованный класс. Поэтому по этой причине я не добавляю никаких свойств, специфичных для WPF (например, перечисление видимости), в мою ViewModel, потому что это обязывает меня использовать WPF вечно (что на самом деле неплохо :)), но это ставит под угрозу обслуживание.

но ваш пробег может отличаться. :)

РЕДАКТИРОВАТЬ:

Между прочим, я не верю, что «модели представления тесно связаны с представлениями». На мой взгляд, представления неразрывно связаны со своими моделями представления, но это должно быть только одним способом. ViewModels должен быть полностью независимым от любой реализации представления. Это как ViewModel - это интерфейс, а View - это конкретный реализованный класс. Поэтому по этой причине я не добавляю никаких свойств, специфичных для WPF (например, перечисление видимости), в мою ViewModel, потому что это обязывает меня использовать WPF вечно (что на самом деле неплохо :)), но это ставит под угрозу обслуживание.

но ваш пробег может отличаться. :)

РЕДАКТИРОВАТЬ:

Между прочим, я не верю, что «модели представления тесно связаны с представлениями». На мой взгляд, представления неразрывно связаны со своими моделями представления, но это должно быть только одним способом. ViewModels должен быть полностью независимым от любой реализации представления. Это как ViewModel - это интерфейс, а View - это конкретный реализованный класс. Поэтому по этой причине я не добавляю какие-либо специфические для WPF свойства (например, перечисление видимости) в мою ViewModel, потому что это обязывает меня использовать WPF для вечности (что на самом деле неплохо :)), но это ставит под угрозу обслуживание.

ViewModels должен быть полностью независимым от любой реализации представления. Это как ViewModel - это интерфейс, а View - это конкретный реализованный класс. Поэтому по этой причине я не добавляю какие-либо специфические для WPF свойства (например, перечисление видимости) в мою ViewModel, потому что это обязывает меня использовать WPF для вечности (что на самом деле неплохо :)), но это ставит под угрозу обслуживание.

ViewModels должен быть полностью независимым от любой реализации представления. Это как ViewModel - это интерфейс, а View - это конкретный реализованный класс. Поэтому по этой причине я не добавляю какие-либо специфические для WPF свойства (например, перечисление видимости) в мою ViewModel, потому что это обязывает меня использовать WPF для вечности (что на самом деле неплохо :)), но это ставит под угрозу обслуживание.

9
ответ дан 2 December 2019 в 00:58
поделиться

There are a number of arguably good scenarios where this behavior is actually desired. In any case, it is by design that bindings swallow errors and is the reason you are going to have trouble finding anything that will help you with this.

The best thing I've seen is an exception validation handler that will display binding errors: http://msdn.microsoft.com/en-us/library/system.windows.controls.exceptionvalidationrule.aspx

The argument for this is views and ViewModels are meant to be decoupled to the point where a View could be used for multiple ViewModels. It also aids in the "Bendability" of the views so that theoretically designer types can style a view without running into a bunch of errors while they are doing it. I realize this might not fit with your process, but that's the story.

1
ответ дан 2 December 2019 в 00:58
поделиться

В настоящее время мы используем Caliburn и модульные тесты, как описано в этой статье Тестирование привязок в WPF . Недостатком этого решения является то, что разработчик пользовательского интерфейса пишет код, который имеет значение только для проверки привязок и может быть опущен, если MS (или кто-то другой) напишет компилятор проверки XAML.

0
ответ дан 2 December 2019 в 00:58
поделиться

Я согласен с предыдущим ответом. Это сделано «по замыслу», и во время компиляции нет возможности проверить это.

Я также обнаружил, что это неприятно.

Лучший и единственный способ, который я нашел, - это проверить вывод отладки Visual Studio во время выполнения. . Любая ошибка привязки будет распечатана, как только вы откроете окно, содержащее ее.

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

-1
ответ дан 2 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: