繁体   English   中英

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

[英]c# WPF MVVM TabControl with Multiple ViewModels and changing tabs

所以我目前有一个带有TabControlWindow MainWindow有自己的ViewModel,所有TabItems也都有自己的ViewModel。

我可以通过绑定的SelectedIndex属性轻松地从MainWindow ViewModel更改选项卡。 我想做的是从另一个选项卡视图模型中运行的代码更改为另一个选项卡。 由于选项卡不是MainWindowViewModel的一部分,因此我正在寻找一种干净的方法来更改选项卡,而无需借助背后的代码来完成。

在某些情况下,可能需要从消息提示之类的选项卡中更改选项卡。 我认为我唯一的方法是从MainWindowViewModel创建事件并订阅它。

所以我用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;
    }
}

而不是试图绑定SelectedIndex ,如果TabItem ■找自己的视图模型,那么你可以为每个视图模型的创建一个属性: IsSelected然后绑定TabItem.IsSelected属性设置为:

<TabItem IsSelected="{Binding IsSelected}">

这可以防止视图模型需要知道其对应的TabItem的索引,我认为这是应该针对视图的细节,而视图模型则不应该关注它。 如果添加另一个TabItem或想更改顺序怎么办? 现在,您可以在视图模型中进行一些更改,而这些更改可能只是对视图的简单更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM