gpt4 book ai didi

c# - MVVM 违规

转载 作者:行者123 更新时间:2023-12-03 10:28:13 28 4
gpt4 key购买 nike

我想澄清一些关于违反 MVVM 的问题。因此,我创建了一个解决方案,其中包含一些项目来演示这些案例。
这是解决方案的定义(项目):

  • View (它是一个 WPF 类库,显然它有 View )
  • ViewModel(它是一个类库,显然它有 viewmodels)
  • 模型(它是一个类库,显然它有模型)
  • 域(它是一个类库,它有应用程序 dataModels )
  • 核心(它是一个类库,它具有 wpf 的核心,如 RelayCommnd 或 EventToCommand)
  • 应用程序(它是一个 wpf 应用程序和启动项目)
  • ExternalCustomControl(它是一个虚构的第三方公司创建的 wpf 自定义控件库)

  • 我为您提供下载整个解决方案以更好地理解
    Here

    第一期:
    我有一个 EventToCommand MainWindow.xaml 对于 结束窗口事件并附加到 主窗口关闭命令 PassEventArgsToCommand 设置为 True,然后,在 主视图型号 有一个名为 的命令的处理程序OnMainWindowClosing
    private void OnMainWindowClosing(object parameter)
    {
    var arg = parameter as CancelEventArgs;

    // What is the best way to show message dialog to user?
    // Do i have to send message to the View to show the messageBox dialog and then the window send me the answer back to continue?
    // What about IMessageBoxService? Doesn't it violates MVVM?

    // Doesn't following code violates the MVVM?
    // Cancel the Closing of a Window isnt a UI side duty?
    arg.Cancel = true;

    }

    并且完全只要你想设置 e.处理 e.取消你面临这个问题。那么你知道任何其他不需要转换 的方法吗?参数作为 取消事件参数 ?

    第二期:
    我有一个 EventToCommand MainWindow.xaml 对于 PreviewMouseDown 网格事件并将其附加到 鼠标点击命令 PassEventArgsToCommand 设置为 True,然后,在 主视图型号 有一个名为 的命令的处理程序鼠标点击 :
     private void OnMouseClick(object parameter)
    {
    // var arg = parameter as MouseButtonEventArgs;

    // This is the violation of MVVM : To cast the parameter to MouseButtonEventArgs i have to add a refrence
    // to PresentationCore.dll in the ViewModel Project

    // The next and worse step is that in most cases we need to know the Original Source of the event
    // (maybe its a StackPanel or a Label or etc) and this again vioaltes the MVVM

    // So Whats the WorkAround?

    }

    第三期:
    我在我的 中使用了第三方控件(Imagine Infragistics 或 DevExpress 或任何其他第三方控件,但这里作为示例,我在我的解决方案中创建了虚构控件作为 ExternalCustomControl 项目)主窗口像这样 :
        <thirdParty:ThirdPartyCustomControl Grid.Row="1"
    ItemsSource="{Binding MyItemsSource,Converter={StaticResource converterKey}}" />

    第三方自定义控件 具有 IEnumarabe<CustomControlDataModel> 类型的属性(CustomControlDataModel 是存在于 ExternalCustomControl 程序集中的一种类型)但是您知道是否要在 中创建属性主视图型号 对于 CustomControlDataModel 类型的控件,您必须添加对 的引用ExternalCustomControl.dll 查看型号 项目,这违反了 MVVM,所以我创建了一个名为 的类型我的数据模型 并将控件的 ItemsSource 绑定(bind)到 我的元素来源 位于 的房产主视图型号 :
        // If i define MyItemsSource as List<CustomControlDataModel> i have to add a refrence to ExternalCustomControl.dll
    // and i think its again violate the MVVM (because ExternalCustomControl.dll is a UI Side Controls Assembly)
    public List<MyDataModel> MyItemsSource { get; set; }

    所以我绑定(bind)了 类型的属性自定义控制数据模型 类型的属性我的数据模型 当然我需要一个转换器:
    public object Convert(object value, Type targetType, object parameter, c     System.Globalization.CultureInfo culture)
    {
    // Imagine when the source data (MyDataModel) is huge (for example 1 milion) it (this dummy Conversion)
    // affects the performance

    if (value is List<MyDataModel>)
    {
    var result = new List<CustomControlDataModel>();

    (value as List<MyDataModel>).ForEach(myVal =>
    {
    var custDataModel = new CustomControlDataModel();
    custDataModel.ID = myVal.ID;
    custDataModel.Name = myVal.Name;
    custDataModel.Age = myVal.Age;

    result.Add(custDataModel);
    });

    return result;
    }
    return value;
    }

    问题是您是否知道比这种虚拟转换更好的方法,或者您通常将第三方程序集添加到您的 View 和 View 模型中?

    这些是我遇到的问题,如果您知道其他问题并与大家分享您的专业知识,如果您添加更多内容,我将不胜感激。

    更新 :

    对于 消息框 第一个问题的一部分我建议这个链接
    MesageBox

    谢谢。

    最佳答案

    优秀的问题!

    1)我个人认为您是正确的,使用服务违反了MVVM。几周前,我就这个确切的主题写了一篇很长的文章,标题为 Implementing Dialog Boxes in MVVM .在那篇文章中,我为 MVVM 对话框的整体问题提供了一个“纯粹”的解决方案,但我花了 11 页来解释我是如何得出这个设计的。幸运的是,实际实现非常简单,类似于数据模板,支持您指定的多项目设计,并且可以与 3rd 方库一起使用。读一读,我总是很欣赏客观的反馈。

    2) 如果您使用的是 MVVM Lite,那么 EventToCommand 允许您指定参数转换器。这是一个示例,我使用它将窗口鼠标移动消息参数转换为我的 View 模型中的等效表示:

    <i:EventTrigger EventName="MouseMove">
    <cmd:EventToCommand Command="{Binding ElementName=_this, Mode=OneWay, Path=MouseMoveCommand}" PassEventArgsToCommand="True" EventArgsConverter="{StaticResource MouseEventArgsConverter}" />
    </i:EventTrigger>

    3)如果我正确理解您的问题,我会添加对 View 和 View 模型项目的引用,至少当这是我的项目结构时。老实说,虽然我通常将我的 View 和 View 模型放在同一个项目中,例如MyProject.UI,所有内容均按类别文件夹排序。我在为一家大型国际公司工作的契约(Contract)中看到了这一点,实际上它工作得非常好,因为您通常同时编辑 View 及其对应的 View 模型;在解决方案窗口中并排放置它们确实使整个开发过程更容易。显然,一些纯粹主义者不太喜欢它,但我个人认为,只要您仍然严格遵守该架构,只需将它们放在同一个项目中就不会破坏 MVVM。我也从来没有在单元测试等方面产生任何问题,您只需要创建 View 模型。

    关于c# - MVVM 违规,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26272121/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com