wpf - 我的设计如何实现 MVVM?

标签 wpf mvvm

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

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

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

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

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

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

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

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

最佳答案

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

要将 View 模型连接到 View ,本质上您需要这样做:

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

view.DataContext = viewModel;

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

然后,您的 View 将绑定(bind)到日志集合以显示每个日志,可能使用 DataTemplate :
<ItemsControl ItemsSource="{Binding Logs}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <!-- XAML to display each Log does here -->
      <TextBlock Text="{Binding FileName}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

关于wpf - 我的设计如何实现 MVVM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14622129/

相关文章:

c# - 从 WPF ListBox 中删除所有左填充

wpf - 查看有关ViewModel的知识

c# - WPF MVVM : ItemTemplate for binding a list of ICommands to a ListBox

android - ViewModel 观察到每个回 fragment

c# - 单一 View ,多个 View 模型 - 避免绑定(bind)错误?

c# - 将 WPF 应用程序迁移到 dotnet Core 3 后获取 TaskCancelledException

wpf - 在 DocumentViewer 中禁用文本选择

c# - WPF 如果滚动查看器的子项调整大小,滚动查看器会自动更新其范围吗?

c# - 带有 Caliburn.micro 的动态 DataGrid 列

c# - 如何冒泡我的 ViewModel 层次结构中的更改?