Я пытаюсь выбрать лучший способ реализовать этот UI в стиле MVVM. Я новичок в WPF (например, 2 месяца)
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 основных подхода:
ListView : UserControl.
Затем, как связать данные, я вижу здесь 3 метода (с XAML или без него не имеет значения). Поскольку нет простой привязки DataBinding к столбцам DataGrid или TabItems TabControl, я вижу следующие методы:
Используйте ручную логику, подписавшись на 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