根据this question以及来自好人的非常有用的答案,我发现 XAML
中不支持泛型类型.我们不允许为我们的用户控件实例化通用 View 模型。
但是,根据这个事实,我决定提出另一个问题:
看法?我们必须为每种类型定义具体的类,那么什么是
拥有一个通用类的好处?起初我尝试通用
View 模型,因为我认为可以自定义 View
根据键入的参数。并使用
WPF
的内容具有类型化方法的组件。 DataContext
中的那些类型参数,为什么我应该使用通用 View 模型,因为 View 模型没有其他用途?因为应用程序的所有逻辑和业务都在模型的中心。而 View Model 只为 View 准备 Model 内的数据呈现。 XAML
中未提供此功能? ?在 WPF
中开发此类功能是否有任何限制? ?或类似的东西,实际上与 MVVM
的性质存在逻辑矛盾。 ? 最佳答案
我可以理解您的沮丧,但我认为这里对 MVVM 模式存在误解:
because all of the logic and business of the application is in the center of the Model. And View Model only prepares presentation of the data inside Model for View.
我可以描述 View 模型的最短方式是它更类似于 MVP 模式中的 Presenter。它是元素根的 DataContext。它协调所有所需数据的加载。它通过 RelayCommands 处理来自按钮单击、文本更改、失去焦点等的 View 调用,并将它们转换为方法调用到服务和存储库上的业务逻辑中。一个简单的只读 View 模型可能如下所示:
[ImplementPropertyChanged]
public class CustomerViewModel : ViewModelBase<Customer>
{
public bool IsBusy { get; private set; }
private ICustomerRepository _customerRepository;
private IWindowService _windowService;
[Inject]
public CustomerViewModel(ICustomerRepository customerRepository, IWindowService windowService)
{
_customerRepository = customerRepository;
_windowService = windowService;
LoadData();
}
private async void LoadData()
{
IsBusy = true;
try
{
// Customer would be in your base, as public T BusinessObject { get; protected set; }
BusinessObject = await _customerRepository.GetSelectedCustomer();
}
catch (Exception err)
{
_windowService.ShowErrorWindow(err);
}
finally
{
IsBusy = false;
}
}
}
这将是可视根的数据上下文(UserControl 或类似的)。不可能所有的逻辑都适用于 ViewModelBase 或类似的。所以这就是为什么我怀疑对模式的误解。
希望这可以帮助。
关于c# - 尽管我们不能在 xaml 中应用它们,但是否有任何理由使用通用 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31760537/