gpt4 book ai didi

c# - 当使用 RegionManager.RequestNavigate 方法添加 View 时,是否有任何方法可以从 Prism 区域中删除 View (按名称)?

转载 作者:太空狗 更新时间:2023-10-29 17:53:36 27 4
gpt4 key购买 nike

我正在使用 Prism用于在我的 WPF MVVM 应用程序中导航。我的观点如下。

// MyView is the data type of the view I want to register and "MyView"
// is the name by which I want the data type to be identified within
// the IoC container.
_container.RegisterType<object, MyView>("MyView");

我将这个 View 显示如下。

_regionManager.RequestNavigate(
"MyRegion", // This is the name of the Region where the view should be displayed.
"MyView" // This is the registered name of the view in the IoC container.
);

在应用程序的其他地方,我需要在事件处理程序中删除这个 View ;但是,以下代码返回 ArgumentNullException

_regionManager.Regions["MyRegion"].Remove(
_regionManager.Regions["MyRegion"].GetView("MyView")
);

这表明 RequestNavigate 方法不会使用名称“MyView”将 MyView 添加到 MyRegion。我知道如果我使用 _regionManager.Add(MyView, "MyView") 方法,GetView 方法将不会返回 null。不幸的是,RequestNavigate 似乎没有以相同的方式处理 View 名称。当使用 RequestNavigate 方法添加 View 时,是否有任何方法可以从区域中删除 View (按名称)?

最佳答案

它源于您添加 View 的方式,而不是移除 View 的方式。 Previously asked通过完全添加 View 来回答,也就是包括名称。

_regionManager.Regions["MyRegion"].Add(myView, "MyView");

现在您可以进行检索和删除了:

var theView = _regionManager.Regions["MyRegion"].GetView("MyView");
_regionManager.Regions["MyRegion"].Remove(theView);

在 Regions.Add() 期间不定义名称

在您的 View 中,定义一个可访问的属性(如果是多项目则为公共(public),如果全部在一个项目中则为内部)。在任何地方都使用这个属性,一个例子是 public string ViewTitle { get { return "XYZ"; } }。然后从 View 中检索具有所需 ViewTitle 的项目。 Views 集合是该区域中 View 的集合,因此您可以在 .NET 4.0+ 中使用 dynamic 来忽略类型并获取您指定的属性/函数,假设它在那里。另一种选择是让您在 View 中导入的 ViewModel 有一个 getter 而不是只设置 DataContext,然后您将检查属性"is"到您正在寻找的 ViewModel。删除字符串搜索但公开 View 的数据上下文。所以可能会像我对区域所做的那样进行枚举。

我将所有内容都包含在我的 View 的 .cs 文件中,这样您就可以看到它是如何工作的,而不会使其复杂化或真正破坏 MVVM。

[ViewSortHint("050")]
[ViewExport(RegionName = RegionNames.WorkspaceTabRegion)]
[PartCreationPolicy(CreationPolicy.Shared)]
public partial class AView : UserControl
{
public AView()
{
InitializeComponent();
}

[Import]
[SuppressMessage("Microsoft.Design", "CA1044:PropertiesShouldNotBeWriteOnly", Justification = "MEF requires property; never retrieved")]
PrintingViewModel ViewModel { set { this.DataContext = value; } }

public string ViewTitle { get { return "AView"; } }
}

现在在 ViewModel 的某个时刻:

   var viewToRemove = RegionManager.Regions[RegionNames.WorkspaceTabRegion].Views.FirstOrDefault<dynamic>(v => v.ViewTitle == "AView");
RegionManager.Regions[RegionNames.WorkspaceTabRegion].Remove(viewToRemove);

关于c# - 当使用 RegionManager.RequestNavigate 方法添加 View 时,是否有任何方法可以从 Prism 区域中删除 View (按名称)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18086195/

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