使用MVVM模式的UI设计

Ale*_*sev 5 c# silverlight wpf xaml mvvm

我正在尝试选择以MVVM方式实现此UI的最佳方法.我是WPF的新手(比如2个月),但我有很棒的WinForms经验. 在此输入图像描述

这里的ListBox就像一个TabControl(所以它将视图切换到右边),基本上包含表格中显示的项目类型.所有UI都是动态的(ListBox项,TabItems和Columns在运行时确定).该应用程序的目标是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; }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是如何将其连接到View.

我可以在这里看到两种基本方法:

  • 使用XAML:由于XAML缺乏泛型支持,我将失去强类型.
  • 没有XAML:我可以重用它 ListView<T> : UserControl.

接下来,如何连接数据,我在这里看到3种方法(使用XAML或不使用此处无关紧要).由于没有简单的DataBinding到DataGrid的Columns或TabControl的TabItems,我看到的方法是:

  • 将DataBinding与IValueConverter一起使用:我认为这不适用于WPF | Silverlight开箱即用控件,因为我需要的一些属性是只读的或不可绑定的双工方式.(我不确定这一点,但我觉得它不起作用).
  • 通过在View中订阅INotifyPropertyChanged来使用手动逻辑:ViewModel.PropertyChanged + = .... ViewModel.ColumnList.CollectionChanged + = ....

  • 使用支持此绑定的自定义控件:我自己编写代码或找到支持此绑定的3d派对控件(我不喜欢这个选项,我的WPF技能太低而无法自己编写代码,我怀疑我会找到免费控件)


更新:28.02.2011 事情变得越来越糟糕,我决定使用TreeView而不是ListBox,这是一场噩梦.您可能猜测TreeView.SelectedItems是一个只读属性,因此没有数据绑定.嗯,好吧,让我们用旧的方式做,并订阅事件来与viewmodel同步视图.此时突然发现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...
}
Run Code Online (Sandbox Code Playgroud)

我所能想到的方法都没有奏效....

这里是我的示例项目的链接,演示了MVVM控制库地狱:http://cid-b73623db14413608.office.live.com/self.aspx/.Public/MVVMDemo.zip

Ale*_*sev 1

我写了一篇文章和一个带有源代码的示例应用程序,我在其中讨论并展示了我在这里提到的问题以及如何解决这些问题。

http://alexburtsev.wordpress.com/2011/03/05/mvvm-pattern-in-silverlight-and-wpf/