c# - WPF 应用程序中控制器的位置是什么
问题描述
当今的大多数应用程序都是 Web 应用程序。因此,大多数指南和示例都是为 Web 应用程序编写的。在我工作的地方,我们正在制作 WPF 应用程序,但有一件事我无法弄清楚:
- 在 WPF 应用程序(使用 MVVM 模式)中,什么代替了控制器?
详细说明:
在 Web 应用程序中,UI 通常通过 HTTP 与控制器通信。然后控制器与服务/存储库/等(取决于架构)进行对话。
我还没有看到 WPF 应用程序中 UI 和后端之间通信的清晰示例。
我看到的示例要么使用非常紧密的耦合(通常在教程中),要么使用 HTTP 后端(基本上使它成为一个 Web 应用程序)。所以如果你想从 HTTP 架构中获得松耦合的优势,但它必须在一个应用程序中,我该如何实现呢?
解决方案
在 MVVM 中,视图绑定到视图模型类。视图模型类可以注入模型或服务。
例如,假设您想显示从某个 REST API 接收到的一些项目的列表。
在视图中,您将定义ItemsControl
绑定到视图模型的集合属性的一个:
<ItemsControl ItemsSource="{Binding Items}" />
您可能还有一个按钮,该按钮绑定到负责获取数据的命令:
视图模型可以这样实现:
public class ViewModel : INotifyPropertyChanged
{
private readonly IRestService _service;
public ViewModel(IRestService service)
{
_service = service;
GetDataCommand = new RelayCommand(GetData);
}
private IEnumerable<string> _items;
public IEnumerable<string> Items
{
get { return _items; }
set { _items = value; NotifyPropertyChanged(nameof(Items)); }
}
public ICommand GetDataCommand { get; }
private async void GetData(object _)
{
var data = await Task.Run(() => _service.GetData());
Items = data;
}
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
RelayCommand
是 ICommand 接口的自定义实现,它执行Action<object>
. 您会在网上找到的大多数实现不支持async
/ await
,即您不能等待命令。这就是为什么GetData
返回void
而不是Task
在上面的示例中。在后台线程上调用服务方法以保持 UI 响应。
推荐阅读
- python - VS Code Azure Functions:pip 配置了需要 TLS/SSL 的位置,但是 Python 中的 ssl 模块不可用
- python - 寻找边缘案例进行测试
- ios - 在层次结构中的每个 UIView 之间进行引用的好方法是什么?
- javascript - 如何在 JavaScript 中将字符串日期(例如“2019-07-26”)更改为“2019 年 7 月 26 日”?
- animation - 如何在 UWP 中为文本颜色设置动画?
- javascript - 如何将在动态 HTML 表中输入的项目添加到模型绑定列表
- html - CSS - @media 标签不会覆盖较小的最大宽度
- python - Pandas read_csv 挂起代码没有错误,但只是有时
- javascript - Javascript/JQuery - 在具有特定值的单元格之前和之后更改 HTML 表格单元格的背景颜色
- java - 并行执行 Spring 初始化 Bean