Дизайн пользовательского интерфейса с использованием шаблона MVVM

Я пытаюсь выбрать лучший способ реализовать этот UI в стиле MVVM. Я новичок в WPF (например, 2 месяца) enter image description here

ListBox здесь действует как TabControl (поэтому он переключает представление вправо) и содержит в основном тип элемента, отображаемого в таблицах. Весь пользовательский интерфейс является динамическим (элементы ListBox, элементы вкладок и столбцы определяются во время выполнения). Приложение нацелено на WPF и Silverlight.

Классы, которые нам нужны для ViewModel:

public abstract class ViewModel : INotifyPropertyChanged {}
public abstract class ContainerViewModel : ViewModel
{
    public IList Workspaces {get;set;}
    public ViewModel ActiveWorkspace {get;set;}
}
public class ListViewModel where TItem : class
{
    public IList ItemList { get; set; }
    public TItem ActiveItem { get; set; }
    public IList SelectedItems { get; set; }
}
public class TableViewModel : ListViewModel where TItem : class
{
    public Ilist ColumnList { get; set; }
}

Теперь вопрос в том, как связать это с View.

Я могу увидеть здесь 2 основных подхода:

  • С XAML: из-за отсутствия поддержки Generics в XAML я потеряю строгую типизацию.
  • Без XAML: я могу повторно использовать тот же ListView : UserControl.

Затем, как связать данные, я вижу здесь 3 метода (с XAML или без него не имеет значения). Поскольку нет простой привязки DataBinding к столбцам DataGrid или TabItems TabControl, я вижу следующие методы:

  • Используйте DataBinding с IValueConverter: Я думаю, что это не будет работать с готовыми элементами управления WPF | Silverlight, поскольку некоторые свойства, которые мне нужны, доступны только для чтения или не могут быть привязаны в дуплексном режиме. (Я не уверен в этом, но мне кажется, что это не сработает.)
  • Используйте ручную логику, подписавшись на INotifyPropertyChanged в View: ViewModel.PropertyChanged + = .... ViewModel.ColumnList.CollectionChanged + = ....

  • Используйте пользовательские элементы управления, поддерживающие эту привязку: Кодируйте самостоятельно или найдите сторонние элементы управления, поддерживающие эту привязку (мне не нравится этот вариант, мой навык WPF слишком низкий, чтобы кодировать это самостоятельно, и я сомневаюсь, что найду бесплатную элементы управления)


Обновление: 28.02.2011 Все становится все хуже и хуже, я решил использовать TreeView вместо ListBox, и это был кошмар. Как вы, наверное, догадались, TreeView.SelectedItems является свойством только для чтения, поэтому для него нет привязки данных. Эммм, хорошо, давайте сделаем это по-старому и подпишемся на события, чтобы синхронизировать представление с моделью просмотра. В этот момент внезапно обнаружилось, что DisplayMemberPath ничего не делает для TreeView (ммммм, ладно, давайте сделаем это по-старому, ToString ()). Затем в методе View я пытаюсь синхронизировать ViewModel.SelectedItem с TreeView:

private void UpdateTreeViewSelectedItem()
{
    //uiCategorySelector.SelectedItem = ReadOnly....

    //((TreeViewItem) uiCategorySelector.Items[uiCategorySelector.Items.IndexOf(Model.ActiveCategory)]).IsSelected = true;
    // Will not work Items's are not TreeViewItem but Category object......

    //((TreeViewItem) uiCategorySelector.ItemContainerGenerator.ContainerFromItem(Model.ActiveCategory)).IsSelected = true;
    //Doesn't work too.... NULL // Changind DataContext=Model and Model = new MainViewModel line order doesn't matter.
    //Allright.. figure this out later...
}

И ни один из методов, о котором я не мог подумать, не работал ....

А вот ссылка на мой пример проекта, демонстрирующего Control Library Hell с MVVM : http://cid-b73623db14413608.office.live.com/self.aspx/.Public/MVVMDemo.zip

5
задан Alex Burtsev 28 February 2011 в 14:51
поделиться