我的设计如何实现MVVM?

时间:2013-01-31 09:16:08

标签: wpf mvvm

我在尝试理解如何在我的应用程序中实现MVVM模式时遇到了问题。这是一个小应用程序,我将解释它的作用。

我的应用程序会创建文件备份。用户界面允许用户选择要备份的文件夹以及备份位置。完成选择后,单击“开始”按钮。

然后将文件夹源和文件夹目标传递给类库(称为backup.cs),该库创建每个文件夹中所有文件的备份。在此期间,会创建一个日志(Log.cs),记录每个阶段以及它尝试备份的每个文件的状态(完成,失败,其他等)。现在,日志仅在内存中。

备份完成后,我想要一个窗口打开(一个视图),它将显示所有日志。在这一点上,我无法理解如何使用MVVM模式。

就像今天一样,我将我的日志(以分层方式保存数据)传递给我的MainWindow构造函数并绑定到datacontext,在我的xaml中使用树视图我得到了所需的结果。但是,我现在想要使用MVVM。

我的问题与我的previous question非常相似,因为您可以看到答案是将日志作为参数传递给ViewModel构造函数。问题是,我不知道该怎么做,还会显示一个窗口!

我能实现这一目标的唯一方法是将Log作为参数传递给我的View的构造函数,但这会破坏MVVM的要点。我可以将参数传递给我的ViewModel的构造函数(这将适合MVVM模式),但这是否意味着我还必须从我的ViewModel构造函数创建我的View实例?否则,我要做的就是创建我的ViewModel,但由于未显示View,因此无法显示结果。

我希望我已经解释了我在哪里挣扎得很清楚,有人可以提出一条前进的方向吗?

2 个答案:

答案 0 :(得分:2)

您很可能希望viewmodel接受(并通过属性公开)一个集合,例如List<Log> - 通常这将是ObservableCollection<Log>,但如果操作已经完成走那条路是没有意义的。这就是您所描述的可能的解决方案。

要将视图模型连接到视图,实际上您需要执行以下操作:

var viewModel = new LogsViewModel(...);
var view = new LogsView(); // no constructor parameters

view.DataContext = viewModel;

最后,您在应用程序窗口的逻辑树的某个位置添加view,以便显示它。 MVVM框架自动执行此过程,但您也可以像这样简单地手动完成。

然后,您的视图将绑定到日志集合以显示每个日志,可能使用DataTemplate

<ItemsControl ItemsSource="{Binding Logs}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <!-- XAML to display each Log does here -->
      <TextBlock Text="{Binding FileName}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

答案 1 :(得分:1)

例如,如果您希望基于按钮显示LogView,请单击主视图。

public override void ShowCommandExecute()
{
    var popup = new LogsView                            
    {
       WindowStartupLocation = WindowStartupLocation.CenterScreen,
       DataContext = new LogsViewViewModel();
    };
    popup.ShowDialog();
}