Tim*_*ver 9 c# navigation wpf prism mvvm
我在我的WPF MVVM应用程序中使用Prism进行导航.我注册我的观点如下.
// 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");
Run Code Online (Sandbox Code Playgroud)
我按如下方式显示此视图.
_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.
);
Run Code Online (Sandbox Code Playgroud)
在应用程序的其他地方,我需要在事件处理程序中删除此视图; 但是,以下代码返回一个ArgumentNullException.
_regionManager.Regions["MyRegion"].Remove(
_regionManager.Regions["MyRegion"].GetView("MyView")
);
Run Code Online (Sandbox Code Playgroud)
这表明,该RequestNavigate方法不添加MyView到MyRegion使用名称"MyView的".我知道如果我要使用该_regionManager.Add(MyView, "MyView")方法,该GetView方法将不会返回null.不幸的是,RequestNavigate似乎没有以相同的方式处理视图名称.使用该RequestNavigate方法添加视图时,有没有办法从区域中删除视图(按名称)?
它源于您添加视图的方式,而不是删除视图。之前提出的问题通过完全添加视图(也称为包括名称)来回答。
_regionManager.Regions["MyRegion"].Add(myView, "MyView");
Run Code Online (Sandbox Code Playgroud)
现在您可以进行检索和删除:
var theView = _regionManager.Regions["MyRegion"].GetView("MyView");
_regionManager.Regions["MyRegion"].Remove(theView);
Run Code Online (Sandbox Code Playgroud)
在您的视图中,定义一个可访问的属性(如果是多项目,则为公共属性;如果全部在一个项目中,则为内部属性)。在所有内容中都使用此属性,一个示例是公共字符串 ViewTitle { get { return "XYZ"; } }。然后从视图中检索具有所需 ViewTitle 的项目。Views 集合是该区域中视图的集合,因此您可以在 .NET 4.0+ 中使用动态来忽略类型并获取您指定的属性/函数(假设它在那里)。另一种选择是让视图中导入的 ViewModel 具有 getter,而不仅仅是设置 DataContext,然后您将检查要查找的 ViewModel 的属性“is”。删除字符串搜索但公开视图的数据上下文。因此,可能会像我对该区域所做的那样进行枚举。
我将所有内容都包含在 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"; } }
}
Run Code Online (Sandbox Code Playgroud)
现在在 ViewModel 中的某个时刻:
var viewToRemove = RegionManager.Regions[RegionNames.WorkspaceTabRegion].Views.FirstOrDefault<dynamic>(v => v.ViewTitle == "AView");
RegionManager.Regions[RegionNames.WorkspaceTabRegion].Remove(viewToRemove);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7199 次 |
| 最近记录: |