我试图使用MVVM,所以我有:如何在另一个线程之间切换视图?
主窗口:
<Window x:Class="tbtest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TabControl ItemsSource="{Binding Tabs}" IsSynchronizedWithCurrentItem="True" Grid.Row="0"/>
<Button Command="{Binding AddNewTab}" Grid.Row="1">Add new tab</Button>
</Grid>
</Window>
和视图模型:
public class VM
{
public VM()
{
Tabs = new ObservableCollection<Object>();
AddNewTab = new DelegateCommand<object>(ExecAddNewTab);
}
private void ExecAddNewTab(object obj)
{
var tab = new SomeTab();
Tabs.Add(tab.View);
ThreadPool.QueueUserWorkItem(item => tab.Activate());
}
public ObservableCollection<Object> Tabs { get; private set; }
public DelegateCommand<object> AddNewTab { get; private set; }
}
每个选项卡是独立的视图模型与景观:
public class SomeTab : ITab, INotifyPropertyChanged
{
public SomeTab()
{
View = new SomeTabView1 {DataContext = this};
}
public string Header { get { return "Header"; } }
private object _view;
public object View
{
get { return _view; }
private set
{
_view = value;
PropertyChanged(this, new PropertyChangedEventArgs("View"));
}
}
public void Activate()
{
Thread.Sleep(2000);
// Some work
Application.Current.Dispatcher.BeginInvoke(new Action<SomeTab>(vm =>
{
// switching views, how can it be done?
vm.View = new SomeTabView2 { DataContext = this };
}), this);
}
public event PropertyChangedEventHandler PropertyChanged = delegate { };
}
SomeTabView1
And SomeTabView2
are si使用TextBlock的'View1'和'View2'实现多个WPF UserControl。
我需要的是在Activate方法(即在单独的线程中运行)将View1切换到View2。
我提供的这段代码不起作用。
我该怎么做才能满足需求?谢谢。
很抱歉,但我不明白。我不需要选择/集中新创建的选项卡项目。我需要,那个标签内容会改变。首先 - 我必须在选项卡视图中显示“正在加载...”,并且当所有数据准备好显示时,我需要将视图更改为DagaGrids,TextBoxes等...... – Lari13