【问题标题】:Prism - How to get all regions in view棱镜 - 如何让所有区域都在视野中
【发布时间】:2020-12-15 14:13:02
【问题描述】:

我需要一种方法来获取我在其中一个视图中定义的区域。例如:

<UserControl ...
             mvvm:ViewModelLocator.AutoWireViewModel="True"
             d:DataContext="{d:DesignInstance errorBars:ErrorBarViewModel, IsDesignTimeCreatable=True}"/>
    <ContentControl mvvm:RegionManager.RegionName="{x:Static regions:SidebarRegions.ErrorSidebarContentRegion}" />

在我的 ViewModel 中,我动态地将视图设置为区域。

_navigationService.Navigate<AnySubView>(SidebarRegions.ErrorSidebarContentRegion);

现在我需要从 RegionsManager 中删除该区域。这很容易,但我需要一种方法来递归地删除它。那是因为 ErrorBarViewModel 不知道它导航到的视图是否也定义了一个区域。如果是这样,我会在删除视图并再次添加新实例时收到错误,因为区域已经定义。

我的想法是遍历 DependencyProperties 或 AttachedProperties 并找出孩子定义了哪些区域,但这似乎行不通。

有人知道如何获取视图定义的区域吗?

【问题讨论】:

  • 我希望删除包含区域的视图也应该永久删除该区域。曾经有一个类似这样的错误报告,但它已被关闭而不采取行动github.com/PrismLibrary/Prism/issues/1157
  • 我认为它正在删除该区域,但如果该区域包含定义其他区域的视图,则不会删除该子区域
  • 我认为这是一个错误或一个限制,无论哪种方式,你都必须前往 github,我想。

标签: c# wpf architecture prism region


【解决方案1】:

根据你的问题的解释,我猜你的应用场景如下:

  • 在多个视图中重复使用此值
  • 导航重用ErrorSidebarContentRegion视图时,出现异常。可能是因为Region在Prism中是唯一的,不能有重复的RegionName

我对上述场景的建议是这样调整逻辑:

  1. RegionName 是动态生成的
  2. 更改你的异常提示(供参考:HandyControl

动态区域名称

public class AttactedErrorSidebarContentRegion
{
    private static readonly Type ownerType = typeof(AttactedErrorSidebarContentRegion);

    internal static readonly DependencyPropertyKey ValuePropertyKey =
        DependencyProperty.RegisterAttachedReadOnly("Value",
            typeof(string), ownerType,
            new PropertyMetadata(default(string)));

    public static readonly DependencyProperty ValueProperty = ValuePropertyKey.DependencyProperty;

    private static void SetValue(DependencyObject element, string value)
    {
        element.SetValue(ValuePropertyKey, value);
    }

    public static string GetValue(DependencyObject element)
    {
        var value = (string) element.GetValue(ValueProperty);
        if (string.IsNullOrEmpty(value))
        {
            value = GetErrorSidebarContentRegionForView(element.GetType());
            SetValue(element, value);
        }
        return value;
    }

    public static string GetErrorSidebarContentRegionForView(Type view)
    {
        var name = view.Name.TrimEnd("View".ToCharArray());
        var region = $"{name}.ErrorSidebarContentRegion";
        return region;
    }

    public static string GetErrorSidebarContentRegionForViewModel(Type viewModel)
    {   
        var name = viewModel.Name.TrimEnd("ViewModel".ToCharArray());
        var region = $"{name}.ErrorSidebarContentRegion";
        return region;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多