我正在尝试选择最佳的方式以MVVM方式实现此UI。我是WPF的新手(大约2个月),但我有丰富的WinForms经验。
这里的ListBox像TabControl一样运作(因此它将视图切换到右侧),并包含基本上在表格中显示的项目类型。所有UI都是动态的(ListBox项、TabItems和列在运行时确定)。该应用程序针对WPF和Silverlight。
我们需要ViewModel的类:
public abstract class ViewModel : INotifyPropertyChanged {}
public abstract class ContainerViewModel : ViewModel
{
public IList<ViewModel> Workspaces {get;set;}
public ViewModel ActiveWorkspace {get;set;}
}
public class ListViewModel<TItem> where TItem : class
{
public IList<TItem> ItemList { get; set; }
public TItem ActiveItem { get; set; }
public IList<TItem> SelectedItems { get; set; }
}
public class TableViewModel<TItem> : ListViewModel<TItem> where TItem : class
{
public Ilist<ColumnDescription> ColumnList { get; set; }
}
现在的问题是如何将其与View连接起来。
这里有两种基本方法:
- 使用XAML:由于XAML中缺乏泛型支持,因此我将会失去强类型。
- 不使用XAML:我可以重用相同的
ListView<T>:UserControl
。
接下来,如何连接数据,我看到这里有3种方法(无论使用XAML还是不使用XAML都没有关系)。由于没有简单的DataBinding到DataGrid的列或TabControl的选项卡,我看到的方法有:
- 使用IValueConverter进行DataBinding:我认为这在WPF | Silverlight的开箱即用控件中不起作用,因为我需要的一些属性是只读或双向不可绑定的。(我不确定,但我觉得它不会起作用)。
通过订阅View中的INotifyPropertyChanged来使用手动逻辑: ViewModel.PropertyChanged+= ....ViewModel.ColumnList.CollectionChanged+= ....
使用支持此绑定的自定义控件:自己编写代码或查找支持此绑定的第三方控件(我不喜欢这个选项,我的WPF技能太低了,我怀疑我会找到免费的控件)
更新:2011年2月28日 事情变得越来越糟糕,我决定使用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...
}
我想到的所有方法都没有起作用...
这是一个示例项目,演示了使用MVVM时的控件库问题:http://cid-b73623db14413608.office.live.com/self.aspx/.Public/MVVMDemo.zip