![](/img/trans.png)
[英]Loading a Taskbar Icon from resources and using Prism to inject view model
[英]Inject view into TabControl using prism library
這就是我定義TabControl
的方式:
<TabControl ItemsSource="{Binding OpenedProjects, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding SelectedProject, Mode=OneWay}">
<!-- headers -->
<!-- header definition is unimportant for this question -->
<!-- content -->
<TabControl.ContentTemplate>
<DataTemplate>
<local:ProjectView />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
這些是我在模塊類中定義的兩個方法,用於注冊和使用視圖:
protected override void _initializeViews() {
_container.RegisterType<MainMenuView>();
_container.RegisterType<ProjectsView>();
_container.RegisterType<ProjectView>();
_container.RegisterType<ContentView>();
}
protected override void _initializeRegions() {
IRegion menuRegion = _regionManager.Regions[RegionNames.MainMenuRegion];
IRegion projectsRegion = _regionManager.Regions[RegionNames.ProjectsRegion];
IRegion contentRegion = _regionManager.Regions[RegionNames.ContentRegion];
menuRegion.Add(_container.Resolve<MainMenuView>());
projectsRegion.Add(_container.Resolve<ProjectsView>());
contentRegion.Add(_container.Resolve<ContentView>());
}
和視圖構造函數:
public ProjectView(ProjectsViewModel vm) {
InitializeComponent();
DataContext = vm;
}
我想要實現的是將ProjectView
注入TabControl
的內容區域。 顯然,由於上述構造函數中的ViewModel
參數,目前它不起作用。 我怎樣才能創建這個功能,PRISM 方式?
編輯:
我發現了這個: How to inject views into TabControl using Prism? 但是,如果我與該問題的作者做同樣的事情,我會得到:
System.InvalidOperationException: ItemsControl's ItemsSource property is not empty.
您的 TabControl 沒有區域,因此您無法向 TabControl 中注入內容。 否則你只能使用簡單的 MVVM 將一些東西注入你的視圖。
使用 Prism 在您的 TabControl 中注入一些東西。 你只需要這一行:
<TabControl prism:RegionManager.RegionName="TabRegion"/>
然后你可以很容易地在你的視圖中注入一些東西。
_regionManager.RequestNavigate("TabRegion", new Uri("ProjectView", UriKind.Relative));
在此之前,您必須使用以下方法將視圖添加到您的容器中:
UnityContainer.RegisterType<object, ProjectView>("ProjectView");
要添加 Headertext,您可以輕松更改 TabItem 的樣式並將 Header 綁定到 ProjectView 中的 ViewModel:
<UserControl.Resources>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding DataContext.Name}" />
</Style>
</UserControl.Resources>
我希望那是你要找的答案^^
@ascholz 的回答幫助我實現了這一點。 盡管最后一步對我不起作用:
<UserControl.Resources>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding DataContext.Name}" />
</Style>
</UserControl.Resources>
我所做的是:
1 - 創建一個帶有棱鏡區域的選項卡控件(在我的例子中是在 MainWindows 內部)。
<TabControl prism:RegionManager.RegionName="TabRegion"/>
2 - 創建一個包含選項卡視圖的 TabItem (NewTabView) 類型的“用戶控件”。 請注意,我在這里綁定了標題。 這里的想法是在此處以及網格內添加一個區域(用於選項卡的內容),或者使每個需要在選項卡內的控件成為 TabItem 的子控件。
<TabItem
x:Class="Client.WPF.Views.NewTab"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
Header="{Binding Title}">
<Grid>
<Button Content="{Binding RandomNumber}"/>
</Grid>
</TabItem>
///The code behind should inherit from TabItem as well
public partial class NewTab : TabItem
///The viewmodel has a "Title" property
private string _title = "New Tab";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
4 - 最后,我像這樣導航到 NewTab(MainWindowViewModel 代碼)
public DelegateCommand NewTab { get; }
public MainWindowViewModel(IRegionManager regionManager, IEventAggregator eventAggregato)
{
this.regionManager = regionManager;
this.eventAggregator = eventAggregator;
NewTab = new DelegateCommand(NewTabAction);
}
private void NewTabAction()
{
regionManager.RequestNavigate("TabRegion", "NewTab");
}
5 - 作為一個額外的好處,如果你想允許超過 1 個選項卡實例,你可以在視圖模型 (NewTabViewModel) 上做這樣的事情。
///First add the IConfirmNavigationRequest interface
public class NewTabViewModel : BindableBase, IConfirmNavigationRequest
///...
///Then the implementation should look like this
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);///Will allow multiple instances (tabs) of this view
}
public void OnNavigatedTo(NavigationContext navigationContext)
{
}
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return false;
}
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
或者您也可以直接向該區域添加視圖。 盡管您需要使用 IContainerProvider 來解析視圖。 像這樣:
var view = containerProvider.Resolve<NewTab>();
regionManager.Regions["TabRegion"].Add(view);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.