将相同的视图两次注册到具有不同行为的 TabControl
Register the same view twice to TabControl with different behavior
我正在寻找一种巧妙的方法来在行为略有不同的 Tabcontrol 中多次实例化一个 View 和 ViewModel。
在最好的情况下使用 Prism7.1
我目前的解决方案是;
在我的主视图中
<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];
}
}
这里我想在我的 ViewModel 中注入 "TabBehavior" 以提供不同的行为。我已经尝试使用 Prism 通过区域在 TabControl 中注册 "MaskingCreation",但是我遇到了两个问题。
- 如果我在区域 a 中正常注册视图,则没有机会注入我想要的行为。
regionManager.RegisterViewWithRegion(Regions.Masking, typeof(MaskingCreation));
- 如果我使用它,我的每一行都会有问题。
- 我想从 ServiceLocation 中获取一个新实例,该实例具有 TabBehavior 的确切变体,但我不知道它应该如何工作。
- 因为我没有让这个 Consturctor 注入工作,所以我必须为 TabBehavior class.
提供 属性
- 最后也是最糟糕的事情。我必须在我的 ViewModel 中存储 View 的引用。我想避免在我的 ViewModel 中使用 DataContext。
regionManager.RegisterViewWithRegion(Regions.Masking, () =>
{
var vm = ServiceLocator.Current.GetInstance<MaskingCreationViewModel>();
vm.Behavior = new TabBehaviorB();
return vm.GetView();
});
有人知道适合 MVVM 模式的智能解决方案吗?
在视图模型中,我将为 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;
}
我正在寻找一种巧妙的方法来在行为略有不同的 Tabcontrol 中多次实例化一个 View 和 ViewModel。 在最好的情况下使用 Prism7.1
我目前的解决方案是;
在我的主视图中
<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];
}
}
这里我想在我的 ViewModel 中注入 "TabBehavior" 以提供不同的行为。我已经尝试使用 Prism 通过区域在 TabControl 中注册 "MaskingCreation",但是我遇到了两个问题。
- 如果我在区域 a 中正常注册视图,则没有机会注入我想要的行为。
regionManager.RegisterViewWithRegion(Regions.Masking, typeof(MaskingCreation));
- 如果我使用它,我的每一行都会有问题。
- 我想从 ServiceLocation 中获取一个新实例,该实例具有 TabBehavior 的确切变体,但我不知道它应该如何工作。
- 因为我没有让这个 Consturctor 注入工作,所以我必须为 TabBehavior class. 提供 属性
- 最后也是最糟糕的事情。我必须在我的 ViewModel 中存储 View 的引用。我想避免在我的 ViewModel 中使用 DataContext。
regionManager.RegisterViewWithRegion(Regions.Masking, () =>
{
var vm = ServiceLocator.Current.GetInstance<MaskingCreationViewModel>();
vm.Behavior = new TabBehaviorB();
return vm.GetView();
});
有人知道适合 MVVM 模式的智能解决方案吗?
在视图模型中,我将为 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;
}