Зарегистрируйте одно и то же представление дважды в TabControl с другим поведением - PullRequest
0 голосов
/ 16 февраля 2019

Я ищу умный способ создания одного экземпляра 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 через регион, но с этим у меня возникают две проблемы.

  1. Если я обычно регистрирую 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?

1 Ответ

0 голосов
/ 16 февраля 2019

В модели представления я бы ввел фабрику для MaskingCreationViewModel и всех вариантов поведения вкладок:

internal class MainViewModel : BindableBase
{
    public MainViewModel( IMaskingCreationViewModelFactory maskingCreationViewModelFactory, IEnumerable<ITabBehavior> tabBehaviors )
    {
        foreach (var tabBehavior in tabBehaviors)
            TabItemCollection.Add( maskingCreationViewModelFactory.Create( tabBehavior ) );

        SelectedTabItem = TabItemCollection.FirstOrDefault();
    }

    public ObservableCollection<MaskingCreationViewModel> TabItemCollection { get; } = new ObservableCollection<MaskingCreationViewModel>();
    public MaskingCreationViewModel SelectedTabItem { get => _selectedTabItem; set => SetProperty( ref _selectedTabItem, value ); }

    private MaskingCreationViewModel _selectedTabItem;
}
...