Я пытаюсь использовать MVVM, поэтому у меня есть:
MainWindow:
<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>
И ViewModel:
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; }
}
Каждая вкладка является отдельной ViewModel с View:
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
И SomeTabView2
- это простой пользовательский контроль WPF с TextBlock 'View1' и 'View2'.
Мне нужен метод Activate (запущенный в отдельном потоке), переключающий View1 на View2.
Этот код, который я предоставил, не работает.
Что я могу сделать, чтобы получить желаемое? Спасибо.