具有多个 ViewModel 和更改选项卡的 c# WPF MVVM TabControl
c# WPF MVVM TabControl with Multiple ViewModels and changing tabs
所以我目前有一个 Window
和一个 TabControl
。 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
或想更改顺序怎么办?现在您可以在视图模型中进行一些更改,这些更改可能只是对视图的简单更改。
所以我目前有一个 Window
和一个 TabControl
。 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
或想更改顺序怎么办?现在您可以在视图模型中进行一些更改,这些更改可能只是对视图的简单更改。