![](/img/trans.png)
[英]WPF tabcontrol programatically changing the # of tabs, their name, and information displayed in C#
[英]c# WPF MVVM TabControl with Multiple ViewModels and changing tabs
所以我目前有一个带有TabControl
的Window
。 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.