c#WPF MVVM TabControl具有多个ViewModel和更改选项卡

时间:2018-01-17 21:03:29

标签: c# wpf mvvm tabcontrol

所以我目前有Window TabControlMainWindow有自己的ViewModel,所有TabItems也有自己的ViewModel。

我可以通过绑定的MainWindow属性轻松更改SelectedIndex ViewModel中的标签。我想要做的是从在另一个选项卡视图模型中运行的代码更改为另一个选项卡。由于Tabs不是MainWindowViewModel的一部分,我正在寻找一种干净的方式来更改Tab而不需要使用后面的代码来完成它。

在某些情况下,我可能需要更改标签,例如消息提示。我认为我唯一的方法是创建和事件,并从MainWindowViewModel订阅。

2 个答案:

答案 0 :(得分:2)

所以我用EventAggregator解决了这个问题。

public static class IntAggregator
{
    public static void Transmit(int data)
    {
        if (OnDataTransmitted != null)
        {
            OnDataTransmitted(data);
        }
    }

    public static Action<int> OnDataTransmitted;
}

第一个ViewModel发送数据。

public class ModifyUsersViewModel : INotifyPropertyChanged
{
    private void change_tab(int data)
    {
        IntAggregator.Transmit(data);
    }
}

第二个ViewModel接收数据,然后用它做一些事情。

public class MainWindowViewModel : INotifyPropertyChanged
{
    private int _Tab_SelectedIndex = 0;
    public int Tab_SelectedIndex
    {
        get
        {
            return _Tab_SelectedIndex;
        }
        set
        {
            _Tab_SelectedIndex = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Tab_SelectedIndex"));
        }
    }

    public MainWindowViewModel()
    {
        IntAggregator.OnDataTransmitted += OnDataReceived;
    }

    private void OnDataReceived(int data)
    {
        Tab_SelectedIndex = data;
    }
}

答案 1 :(得分:0)

如果SelectedIndex拥有自己的视图模型,而不是尝试绑定到TabItem,那么您可以为每个视图模型创建一个属性:IsSelected然后绑定该TabItem.IsSelected属性:

<TabItem IsSelected="{Binding IsSelected}">

这可以防止视图模型需要知道它们对应的TabItem的索引,我认为这是一个应该特定于视图的细节以及视图模型不应该关注的东西。如果您添加其他TabItem或想要更改订单怎么办?现在,您已经在视图模型中进行了更改,以便对视图进行简单的更改。