【发布时间】:2011-07-05 05:55:24
【问题描述】:
我正在尝试选择以 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; }
}
现在的问题是如何将其连接到 View。
我可以在这里看到两种基本方法:
- 使用 XAML:由于 XAML 中缺乏泛型支持,我将失去强类型。
- 没有 XAML:我可以重复使用相同的
ListView<T> : UserControl.
接下来,如何连接数据,我在这里看到了 3 种方法(这里有没有 XAML 都无所谓)。由于没有简单的 DataBinding 到 DataGrid 的列或 TabControl 的 TabItems 我看到的方法是:
- 将 DataBinding 与 IValueConverter 一起使用:我认为这不适用于 WPF|Silverlight 开箱即用的控件,因为我需要的某些属性是只读的或无法以双工方式绑定。 (对此我不确定,但我觉得它行不通)。
通过在视图中订阅 INotifyPropertyChanged 来使用手动逻辑:ViewModel.PropertyChanged+= ....ViewModel.ColumnList.CollectionChanged+= ....
使用支持此绑定的自定义控件:自己编写代码或查找支持此绑定的 3d 方控件(我不喜欢此选项,我的 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...
}
而且我能想到的方法都没有奏效......
这里是我演示使用 MVVM 控制库地狱的示例项目的链接:http://cid-b73623db14413608.office.live.com/self.aspx/.Public/MVVMDemo.zip
【问题讨论】:
-
我在 Silverlight 论坛上的类似主题:forums.silverlight.net/forums/64.aspx
标签: c# wpf silverlight xaml mvvm