Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带Prism的MVVM编码是否与MVVM本身不同?_C#_Wpf_Mvvm - Fatal编程技术网

C# 带Prism的MVVM编码是否与MVVM本身不同?

C# 带Prism的MVVM编码是否与MVVM本身不同?,c#,wpf,mvvm,C#,Wpf,Mvvm,我最近用MVVM创建了一个接口,确保没有代码隐藏。我们在印度的开发团队重新使用了该接口,并做了一些修改。当我使用新的UI时,我发现这些修改似乎打破了我在视图和viewmodel之间所做的一些绑定。然后我在下面的视图中找到了这个新代码。我只包含了部分代码。可以看到viewmodel在视图中被多次引用。我认为这是一个非常沮丧的决定。我知道在视图中为viewmodel设置setter是他们在Prism实现中经常做的事情,但我以前从未见过从视图中实际调用viewmodel。我不想向他们的主管提起这件事,

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

    [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);
        }
    }
[导入]
公共配置文件限制视图模型视图模型
{
得到
{
将DataContext作为ProfileLimitsViewModel返回;
}
设置
{
数据上下文=值;
_performSelection=true;
ViewModel.OnSelectedProfilesChanged-=setSelection;
ViewModel.OnSelectedProfilesChanged+=setSelection;
}
}
/// 
///在用户界面中更改配置文件选择
/// 
private void Profile List_SelectionChanged(对象发送方,SelectionChangedEventArgs e)
{
尝试
{
整数计数=0;
ViewModel.SelectedProfiles.Clear();
//如果选择了多个配置文件
如果(ProfileList.SelectedItems.Count>0)
{
foreach(配置文件列表中的变量配置文件。选择EditEMS)
{
ViewModel.SelectedProfiles.Add((profile作为ProfileNS.ProfileID);
//选定的配置文件
如果(计数+==0)
ViewModel.SelectedProfile=配置文件作为配置文件;
}
}
如果(_performSelection)
{
ViewModel.SelectedFormationId=ViewModel.SelectedProfile.Layers[0].BedId;
ViewModel.ProfileSelectionChanged();
}
}
捕获(例外情况除外)
{
诊断。LogHandledException(ex);
}
}
/// 
///闭上
/// 
/// 
/// 
私有void ProfileEditor_已关闭(对象发送方,RoutedEventArgs e)
{
//事件以更新ContextAltab中的ProfileEditor复选框
ServiceLocator.Current.GetInstance().Publish
(MCWDEditorMode.Close);
ViewModel.ModuleService.UpdateMcwdEditorViewModelsHash(ViewModel.WellLandingId,null);
}
/// 
///论用户界面中的队形选择
/// 
/// 
/// 
私有void ProfileLayersDataGrid\u SelectionChanged(对象发送方,selectionchangedventargs e)
{
尝试
{
如果(e.AddedItems!=null&&e.AddedItems.Count>0&&U性能选择)
ViewModel.FormationSelectionChanged(e.AddedItems[0]);
}
捕获(例外情况除外)
{
诊断。LogHandledException(ex);
}
}

C中的事件处理程序肯定是您没有正确执行MVVM的标志。我看着你,
ProfileList\u SelectionChange
。你/你老板的参考:Prism只为你提供正确执行MVVM的工具;这并不妨碍您以WinForms风格做事。

托德·斯普林格是对的,至少部分是对的。使用EventHandler可能有正当的理由,但Todd(
ProfileList\u SelectionChange
)指出的理由肯定不属于那里,RoutedEventArgs也不属于那里,因为它们都是在Presentation.dll中定义的

通过将MVVM层拆分为多个程序集,可以很容易地实现这一点

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

MyViewModels.dll不应引用UI/桌面程序集,也不应引用Presentation.dll。如果开发人员需要使用您自动知道的Presentation.dll中的任何内容,那么它将违反MVVM,因为您将在代码中引用特定于平台或视图的类型。看起来印度的人群对WPF不太了解。我快速查看了您的链接,似乎Viewmodel{get,set}是Prism的标准配置,但是从视图中调用Viewmodel的所有其他调用都是否定的。需要考虑的主要问题是,如果您有一个视图,并且了解Viewmodel中公开的事件,您创建了一个不适当的(非MVVM)依赖项。这就是为什么ViewModel公开了命令和行为,提供了解耦类所需的间接方法。谢谢。您已经向我提供了需要向团队负责人展示的信息,并修复了代码。我还建议您的上司或您的团队将程序集分开。装入MyApp.ViewModels.dll程序集,并仅将ViewModels放在那里。将与视图相关的内容放入MyApp.UI.dll程序集中,并将与应用程序相关的内容放入MyApp.Desktop.dll或MyApp.WinPhone.dll等,具体取决于您使用的平台。MyViewModels.dll不应引用UI/桌面程序集,也不应引用Presentation.dll。如果出于任何原因,程序员需要使用Presentation.dll中您自动知道的任何内容,则会违反MVVM