1

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

我的应用程序创建文件备份。UI 允许用户选择他们想要备份的文件夹以及应该备份的位置。做出选择后,他们单击“开始”按钮。

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

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

就目前而言,我将我的日志(以分层方式保存数据)传递给我的 MainWindow 的构造函数并绑定到数据上下文,使用我的 xaml 中的树视图,我得到了所需的结果。但是,我现在想使用 MVVM。

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

我可以实现这一点的唯一方法(在我的脑海中)是将日志作为参数传递给我的视图的构造函数,但这违背了 MVVM 的观点。我可以将参数传递给我的 ViewModel 的构造函数(这将符合 MVVM 模式),但这是否意味着我还必须从我的 ViewModel 构造函数创建我的视图实例?否则我要做的就是创建我的 ViewModel 但由于没有显示视图,因此无法显示结果。

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

4

2 回答 2

2

您很可能希望视图模型接受(并通过属性公开)一个集合,例如 a List<Log>- 通常这将是 a 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>
于 2013-01-31T09:25:54.673 回答
1

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

public override void ShowCommandExecute()
{
    var popup = new LogsView                            
    {
       WindowStartupLocation = WindowStartupLocation.CenterScreen,
       DataContext = new LogsViewViewModel();
    };
    popup.ShowDialog();
}
于 2013-01-31T09:29:36.790 回答