c# - 尽管我们不能在 xaml 中应用它们,但是否有任何理由使用通用 View 模型?

标签 c# wpf xaml generics mvvm

根据this question以及来自好人的非常有用的答案,我发现 XAML 中不支持泛型类型.我们不允许为我们的用户控件实例化通用 View 模型。
但是,根据这个事实,我决定提出另一个问题:

  • 当我们不能在一个通用 View 模型中使用它时,为什么要创建一个通用 View 模型?
    看法?我们必须为每种类型定义具体的类,那么什么是
    拥有一个通用类的好处?起初我尝试通用
    View 模型,因为我认为可以自定义 View
    根据键入的参数。并使用 WPF 的内容具有类型化方法的组件。
  • 人们建议我为每种类型创建一个基本的通用 View 模型和几个子具体类。在这种情况下,该泛型类的用途是什么?据我所知, View 模型是一个对绑定(bind)到数据上下文很有用的概念。因此,如果无法访问 DataContext 中的那些类型参数,为什么我应该使用通用 View 模型,因为 View 模型没有其他用途?因为应用程序的所有逻辑和业务都在模型的中心。而 View Model 只为 View 准备 Model 内的数据呈现。
  • 为什么 Microsoft 在 XAML 中未提供此功能? ?在 WPF 中开发此类功能是否有任何限制? ?或类似的东西,实际上与 MVVM 的性质存在逻辑矛盾。 ?
  • 最佳答案

    我可以理解您的沮丧,但我认为这里对 MVVM 模式存在误解:

  • 一个通用的 基地 如果您的 View 模型之间有很多共享功能,那么类将很有用。然而,在 MVVM 中,ViewModel 意味着比在 MVC 中更复杂(和不同)。它们与服务对话,并充当 GUI 和较低层/代码/业务逻辑或其他任何东西之间的粘合剂。你居然可以使用使用 DI/IoC 的通用 View 模型,只需注入(inject) ViewModelBase 并将其设置为数据上下文,最好在构造函数中。根据您使用的 IoC 容器,您只需向它注册您的类型。 然而 ,您需要的 View 模型的所有代码都在该基类中是非常可疑的——这意味着没有特定于某个 View 模型的代码!我怀疑您将 MVVM View 模型与 MVC View 模型混淆了,这是我见过的常见错误。
  • 这是我认为您误解了 MVVM 模式中的 ViewModel 的部分。

  • 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 到业务逻辑和模型的回调(RelayCommands、TwoWay 的 DataBindings)。它还会在创建 View 时加载数据。所以不要误认为 MVVM 中的 View 模型只是从 ModelClass 到 ModelClassForViewBinding 的转换器。
  • 您可能可以应用一些技巧来完成这项工作。然而,我们大多数人从未遇到过这个问题。我的猜测是,它需要对标记和附加功能进行太多更改,而产量很少。是不是 由于上述原因,与 MVVM 矛盾。

  • 我可以描述 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/

    相关文章:

    c# - HttpWebRequest Post 方法发送部分数据

    c# - List<T>.FindAll 的结果是否保证与原始列表的顺序相同?

    c# - 是否有可能将委托(delegate)的执行从一个线程移动到另一个中间执行?

    c# - 在默认 AppDomain 中托管在 Winforms 中的 WPF 用户控件在弹出窗口中损坏的选项卡导航

    c# - 带有 TextBlock 和复选框的 XAML ToggleButton

    c# - 根据字符串查找文本框并更改其文本

    c# - 使用自定义数据创建 Activereports PageReport

    图像源上的 wpf 数据触发器

    c# - WPF:MVVM 中的 TreeView

    c# - 尝试将数据绑定(bind)从 MainWindow.xaml.cs 移动到另一个 ViewModel 模块