带有Prism的MVVM的编码是否与单独的MVVM不同

本文关键字:MVVM 单独 不同 编码 Prism 带有 是否 | 更新日期: 2023-09-27 18:19:53

我最近用MVVM创建了一个接口,确保没有代码隐藏。我们在印度的开发团队经过一些修改后重新使用了该接口。当我使用新的UI时,我发现这些修改似乎打破了我在视图和视图模型之间所做的一些绑定。然后我在下面的视图中找到了这个新代码。我只包含了部分代码。您可以看到视图模型在视图中被多次引用。我觉得这是一种非常沮丧的情绪。我知道在视图中为视图模型设置一个setter是他们在Prism实现中一直在做的事情,但我以前从未见过从视图中实际调用视图模型。我不想向他们的主管提起这个问题,除非我确信我在良好编码实践方面的立场。

    [Import]
    public ProfileLimitsViewModel ViewModel
    {
        get
        {
            return DataContext as ProfileLimitsViewModel;
        }
        set
        {
            DataContext = value;
            _performSelection = true;
            ViewModel.OnSelectedProfilesChanged -= setSelection;
            ViewModel.OnSelectedProfilesChanged += setSelection;
        }
    }
    /// <summary>
    /// On Profile selection changed in UI
    /// </summary>
    private void ProfileList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        try
        {
            int count = 0;
            ViewModel.SelectedProfiles.Clear();
            //if multiple profile is selected
            if (ProfileList.SelectedItems.Count > 0)
            {
                foreach (var profile in ProfileList.SelectedItems)
                {
                    ViewModel.SelectedProfiles.Add((profile as ProfileNS).ProfileID);
                    //the profile that is selected
                    if (count++ == 0)
                        ViewModel.SelectedProfile = profile as ProfileNS;
                }
            }
            if (_performSelection)
            {
                ViewModel.SelectedFormationId = ViewModel.SelectedProfile.Layers[0].BedId;
                ViewModel.ProfileSelectionChanged();
            }
        }
        catch(Exception ex)
        {
            Diagnostics.LogHandledException(ex);
        }
    }
    /// <summary>
    /// on closed
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void ProfileEditor_Closed(object sender, RoutedEventArgs e)
    {
        //Event to update ProfileEditor checkbox in ContextualTab
        ServiceLocator.Current.GetInstance<IEventAggregatorService>().Publish
            <ProfileEditorSelectedEvent, MCWDEditorMode>(MCWDEditorMode.Close);
        ViewModel.ModuleService.UpdateMcwdEditorViewModelsHash(ViewModel.WellLandingId, null);
    }
    /// <summary>
    /// On formation selection changed in UI
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void ProfileLayersDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        try
        {
            if (e.AddedItems != null && e.AddedItems.Count > 0 && _performSelection)
                ViewModel.FormationSelectionChanged(e.AddedItems[0]);
        }
        catch (Exception ex)
        {
            Diagnostics.LogHandledException(ex);
        }
    }

带有Prism的MVVM的编码是否与单独的MVVM不同

C#中的事件处理程序是您没有正确执行MVVM的可靠标志。我看着你,ProfileList_SelectionChange。为您/您的老板提供参考:https://msdn.microsoft.com/en-us/library/hh848246.aspxPrism只为您提供正确执行MVVM的工具;它不会阻止您使用WinForms样式进行操作。

Todd Sprang是对的,至少部分是对的。使用EventHandlers可能有正当的理由,但Todd指出的EventHandlers(ProfileList_SelectionChange)和RoutedEventArgs都不属于EventHandlers,因为它们都在Presentation.dll中定义。

通过将MVVM层拆分为多个程序集,有一些非常简单的方法可以实现这一点。

  • MyApp.ViewModels.dll程序集,并仅将ViewModels放在那里
  • 将与视图相关的内容放入MyApp.UI.dll程序集中(视图)
  • 与应用程序相关的文件进入MyApp.Desktop.dll或MyApp.WinPhone.dll等平台形式依赖的东西,WPF,XAML,Silverlight,ASP.NET)

MyViewModels.dll不应该引用UI/DDesktop程序集,也不应该引用Presentation.dll。如果开发人员需要使用Presentation.dll中的任何内容,您会自动知道,这违反了MVVM,因为您将在代码中引用特定于平台或视图的类型