wpf 使用PRISM区域时选择选项卡时,不会在TabControl中调用OnNavigatedTo

osh3o9ms  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(323)

我已经用区域管理器为TabControl注册了我的视图,当选择选项卡时,视图会正确显示。
问题是,当我选择新选项卡项时,不会为该视图或其视图模型调用OnNavigatedTo。
我用的是PRISM 63

更新

视图模型
`public class ValuationViewModel:IViewModel,INavigationAware { private IRegionManager _regionManager;

public string Title { get; set; }

    public ValuationViewModel(IRegionManager regionManager)
    {
        Title = "PERFORM VALUATION";

        _regionManager = regionManager;
    }

    public void OnNavigatedTo(NavigationContext navigationContext)
    {
    }

    public bool IsNavigationTarget(NavigationContext navigationContext)
    {
        return true;
    }

    public void OnNavigatedFrom(NavigationContext navigationContext)
    {
    }
}`

View `public partial class ValuationView:UserControl,IView { private IRegionManager _regionManager;

public ValuationView(ValuationViewModel viewModel)
    {
        InitializeComponent();

        ViewModel = viewModel;
    }

    public IViewModel ViewModel
    {
        get
        {
            return (IViewModel)DataContext;
        }
        set
        {
            DataContext = value;
        }
    }
}`
oaxa6hgo

oaxa6hgo1#

没有密码,没有人能给予你正确的答案。这可能是最好的,如果你给我们你的“TabItem”视图的ViewModel。
假设您在DataContext中注册了视图并正确设置了ViewModel,那么可能会忘记一件简单的事情。
要管理您的问题,请确保您正确地实现了以下内容:
1.为TabControl创建区域
1.注册该区域中的视图
1.确保DataContext已正确设置为ViewModel
1.确保ViewModel实现了INavigationAware

更新1:

在测试了很多之后,不幸的是,我找到了一个简单的答案:
当NavigationService正在导航时,调用INavigationAware(OnNavigatedToIsNavigationTarget & OnNavigatedFrom)的成员。如果你点击TabItemHeader,它们就不会出现。
要解决你的问题,你有几个选择。一个选项是在用户单击TabItemHeader时启动导航请求(糟糕的方法)。
在我看来,你应该使用IActiveAware接口(https://msdn.microsoft.com/en-us/library/microsoft.practices.prism.iactiveaware(v=pandp.50).aspx)。
它将解决您的问题,因为通过RegionManager导航和单击TabItemHeader的结果相同:INavigationAware。IsActive = true。
现在你可以检测到你的标签是否显示并做出React。

qlvxas9a

qlvxas9a2#

我知道这是一个相当古老的主题,但这是我对这个问题的简单解决方案。..

public class HtaTabControl : TabControl
{
    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        var nc = new NavigationContext(null,
            e.AddedItems.Count > 0 ? new Uri(e.AddedItems[0].GetType().Name, UriKind.RelativeOrAbsolute) : null);

        if (e.RemovedItems.Count > 0)
        {
            if (e.AddedItems[0] is FrameworkElement fromTabItem)
            {
                var vm = fromTabItem.DataContext as INavigationAware;
                vm?.OnNavigatedFrom(nc);
            }
        }
        if (e.AddedItems.Count > 0)
        {
            if (e.AddedItems[0] is FrameworkElement toTabItem)
            {
                var vm = toTabItem.DataContext as INavigationAware;
                vm?.OnNavigatedTo(nc);
            }
        }

        base.OnSelectionChanged(e);
    }
}

我可能会在某个时候重新讨论这个问题,但这对我来说是有效的,所以我可以在发生“导航”时在VM之间传递参数。

相关问题