棱镜。 EventAggregator到当前有效标签

时间:2016-12-22 09:38:47

标签: c# design-patterns prism prism-5

我有这个UI shell:
enter image description here

在刷新按钮上,我拨打_eventAggregator.GetEvent<RefreshEvent>().Publish();

标签中所有区域的代码都订阅了此活动。

问题: 问题是我只想更新当前活动的选项卡。但在我的情况下,所有标签都在更新。有没有好的做法来解决这个问题?

修改1
我在视图中实现了IActiveAware

public partial class ShipsControlView : UserControl, IActiveAware
{
    public ShipsControlView()
    {
        InitializeComponent();
    }

    private bool isActive;

    public bool IsActive
    {
        get
        {
            return this.isActive;
        }
        set
        {
            if (this.isActive == value)
                return;

            this.isActive = value;

            var viewModelActiveAware = this.DataContext as IActiveAware;
            if (viewModelActiveAware != null)
                viewModelActiveAware.IsActive = value;

            this.OnIsActiveChanged();
        }
    }

    public event EventHandler IsActiveChanged;

    protected virtual void OnIsActiveChanged()
    {
        var handler = this.IsActiveChanged;
        if (handler != null)
            handler(this, EventArgs.Empty);
    }
}

将此视图添加到tabControl:

<TabControl
        prism:RegionManager.RegionName="TabRegion2"
        ItemContainerStyle="{StaticResource HeaderStyle}"
        ></TabControl>

regionManager.RegisterViewWithRegion("TabRegion2", typeof(ShipsControlView));

我检查IsActive的状态,如果我点击标签(正常工作),它总会被更改。

问题: 如果tab未激活,则该选项卡中的命令会触发我的全局复合按钮,但不能触发。

1 个答案:

答案 0 :(得分:1)

您不应该为此使用事件聚合器。您应该使用CompositeCommands。他们甚至可以在自动实施IActiveAware时监控活动标签/虚拟机。

以下是文档:http://prismlibrary.readthedocs.io/en/latest/WPF/09-Communication/#solution-commanding