【问题标题】:c# WPF MVVM TabControl with Multiple ViewModels and changing tabsc# WPF MVVM TabControl 与多个 ViewModels 和更改选项卡
【发布时间】:2018-01-17 21:03:29
【问题描述】:

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

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

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

【问题讨论】:

  • 由于选项卡不是该 ViewModel 的一部分,这是代码异味。最简单的方法是将集合绑定到包含每个页面视图模型的选项卡控件上的 ItemsSource,然后绑定到 SelectedItem 并将任何页面视图模型应该是该属性中的选定选项卡。这是最简单、最简单、最有用和最可靠的方法。你为什么不那样做? (这是给你的工作原型stackoverflow.com/a/5651542/1228
  • @Will 我认为你完全错过了理解我的问题。我没有生成新的视图模型。每个选项卡都有自己预先建立的视图模型,我正在寻找一种简单的方法来从选项卡视图模型的 MainWindow 视图模型中设置 SelectedIndex 数据绑定。实际上,我已经找到了一种简单的方法,我即将发布。

标签: c# wpf mvvm tabcontrol


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    <TabItem IsSelected="{Binding IsSelected}">
    

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

    【讨论】:

    • 这仍然不能满足我的需要。由于该属性绑定只会与其自己的数据上下文相关联,因此您仍然需要某种 EventAggregator 或消息传递系统才能让一个选项卡打开另一个选项卡。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2014-05-24
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    相关资源
    最近更新 更多