Как заставить Silverlight MVVM работать с данными времени разработки Expression Blend? - PullRequest
4 голосов
/ 28 июля 2010

Я большой сторонник шаблона MVVM с Silverlight.В настоящее время я связываю ViewModel с View, обновляя ViewModel в коде за представлением, таким образом:

public partial class SomePage : UserControl
{
    public SomePage()
    {
        InitializeComponent();

        // New up a ViewModel and bind to layout root
        var vm = new SomeViewModel();
        LayoutRoot.DataContext = vm;
    }
}

А затем вся привязка обрабатывается в View и вся логика обрабатываетсяViewModel, как и предполагается в шаблоне.

Однако их соединение означает, что конструктор не работает должным образом, и я не могу использовать данные времени разработки Expression Blend.Я знаю, что есть библиотеки, такие как MVVM Light, которые помогут заставить все это работать, но я предпочитаю не вводить библиотеку, поскольку это «еще одна вещь», с которой приходится иметь дело.

Есть простой шаблон для подключения MVVM в Silverlight при сохранении функциональности дизайнера, особенно в Blend?Я немного погуглил, но там так много устаревших статей и так много путаницы между WPF и Silverlight и более старыми версиями, что мне трудно разобраться, что использовать.

Кстати, на чем я сосредоточенSL4 с VS2010, если это имеет значение.

Ответы [ 3 ]

3 голосов
/ 29 июля 2010

Есть несколько методов, которые вы можете использовать.

Сначала , пусть примерные данные Expression и атрибуты времени разработки (т.е. d: DataContext) вступят во владение в конструкторе. В своем коде вы бы просто обусловили привязку модели представления:

if (!DesignerProperties.IsInDesignTool)
{
   var vm = new SomeViewModel();
   LayoutRoot.DataContext = vm; 
}

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

LayoutRoot.DataContext = DesignerProperties.IsInDesignTool ?
    new DesignViewModel() : new MyViewModel(); 

Наконец, , еще один способ - управлять данными в модели представления. Мне это не нравится, потому что это распределяет ответственность по всем моделям представлений, но у вас больше точности:

// constructor
private Widget[] _designData = new[] { new Widget("Test One"), new Widget("Test Two") };

public MyViewModel()
{
   if (DesignerProperties.IsInDesignTool)
   {
       MyCollection = new ObservableCollection<Widget>(_designData);       
   }
   else 
   {
       MyService.Completed += MyServiceCompleted;
       MyService.RequestWidgets();
   }
}

private void MyServiceCompleted(object sender, AsynchronousEventArgs ae)
{
   // load up the collection here
}

Надеюсь, это поможет!

2 голосов
/ 30 июля 2010

То, что вы ищете, это " Blendibility ". MVVM Light имеет концепцию ViewModelLocator, и я использую ее в проекте с отличными результатами.

Вот отличный пост Roboblob по теме. http://blog.roboblob.com/2010/01/17/wiring-up-view-and-viewmodel-in-mvvm-and-silverlight-4-blendability-included/ Этот пост имеет пример решения, поэтому он действительно помогает в понимании. Роб совершенствует реализацию MVVM Light, и я думаю, что справляется хорошо.

1 голос
/ 28 июля 2010

Я сталкивался с подобными проблемами при разработке приложений WPF. Один из приемов, который я узнал, - это объявление xmlns, чтобы вы могли встраивать массив объектов в XAML:

xmlns:coll="clr-namespace:System.Collections;assembly=mscorlib"

Затем вы можете поместить ArrayList практически всего в XAML:

<coll:ArrayList x:Key="questions">
    <local:QuestionItem Title="FOO"></local:QuestionItem>
</coll:ArrayList>

Затем вы можете установить для массива ItemsSource сетки, списка и т. Д. Значение:

<ListBox x:Name="lstStuff" ItemsSource="{StaticResource questions}" />

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

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

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