Я ищу умный способ создания одного экземпляра View и ViewModel несколько раз в Tabcontrol с немного другим поведением.В лучшем случае, используя Prism7.1
Мое текущее решение:
в моем MainView
<TabControl
ItemsSource="{Binding TabItemCollection}"
SelectedItem="{Binding SelectedTabItem}"
ItemContainerStyle="{DynamicResource ItemSize20_HeaderBinding}"
mah:TabControlHelper.Underlined="SelectedTabItem">
<TabControl.Resources>
<DataTemplate DataType="{x:Type vm:MaskingCreationViewModel}" >
<local:MaskingCreation/>
</DataTemplate>
</TabControl.Resources>
</TabControl>
в моем MainViewModel
public class MainViewModel
{
public ObservableCollection<MaskingCreationViewModel> TabItemCollection { get; set; }
public MaskingCreationViewModel SelectedTabItem { get; set; }
public MainViewModel()
{
TabItemCollection = new ObservableCollection<MaskingCreationViewModel>();
TabItemCollection.Add(new MaskingCreationViewModel(new TabBehaviorA()));
TabItemCollection.Add(new MaskingCreationViewModel(new TabBehaviorB()));
SelectedTabItem = TabItemCollection[0];
}
}
ЗдесьЯ хочу, чтобы «TabBehavior» в моей ViewModel обеспечить другое поведение.Я уже пытался сделать это с помощью Prism, чтобы зарегистрировать «MaskingCreation» в TabControl через регион, но с этим у меня возникают две проблемы.
- Если я обычно регистрирую View в регионе, у меня нетшанс ввести поведение, которое я хочу.
regionManager.RegisterViewWithRegion(Regions.Masking, typeof(MaskingCreation));
если я использую это, у меня проблема с каждой строкой этого.
- Я хочу получить новый экземпляр от ServiceLocation именно с этим вариантом TabBehavior, но я не знаю, как это должно работать.
- Поскольку я не получаю эту инъекцию Consturctor вработа, которую я должен предоставить свойство для класса TabBehavior.
- И последнее и худшее.Я должен хранить ссылку на представление в моей ViewModel.Я хочу избежать использования DataContext внутри моей ViewModel.
regionManager.RegisterViewWithRegion(Regions.Masking, () =>
{
var vm = ServiceLocator.Current.GetInstance<MaskingCreationViewModel>();
vm.Behavior = new TabBehaviorB();
return vm.GetView();
});
Кто-нибудь знал умное решение, которое вписывается в шаблон MVVM?