Edw*_*uay 8 prism composite-application-gu
在Prism v2应用程序中,我定义了两个区域,每个区域都是tabcontrol中的一个tabitem:
<UniformGrid Margin="10">
<TabControl>
<TabItem Header="First" Name="MainRegion" cal:RegionManager.RegionName="MainRegion"/>
<TabItem Header="Second" Name="SecondRegion" cal:RegionManager.RegionName="SecondRegion"/>
</TabControl>
</UniformGrid>
Run Code Online (Sandbox Code Playgroud)
在引导程序中加载了两个模块,每个模块都为每个tabitems注入一个视图:
protected override IModuleCatalog GetModuleCatalog()
{
ModuleCatalog catalog = new ModuleCatalog();
catalog.AddModule(typeof(SecondModule.SecondModule));
catalog.AddModule(typeof(HelloWorldModule.HelloWorldModule));
return catalog;
}
Run Code Online (Sandbox Code Playgroud)
现在,当然,我想要执行我一直阅读的解耦魔法并取消注释其中一个模块,并看到它的标签项根本不显示.相反,相反,仍然有两个TabItem,一个是空的.这告诉我,我的应用程序仍然紧密地耦合数据和UI,就像旧的WinForm时代那样.
那么我需要做些什么来使这个动态化,以便UI根据加载的模块动态变化,即我可以在我的引导程序中加载10个模块/视图,TabControl中会自动出现10个TabItems?
如果我只是在TabControl中创建一个区域:
<TabControl Name="MainRegion" cal:RegionManager.RegionName="MainRegion"/>
Run Code Online (Sandbox Code Playgroud)
然后将两个控件加载到MainRegion中:
public void Initialize()
{
regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.SecondView));
}
...
public void Initialize()
{
regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.HelloWorldView));
}
Run Code Online (Sandbox Code Playgroud)
然后我得到一个带有两个标签的TabControl,每个标签都有一个视图,这就是我想要的.
但是没有定义TabItem标头.如何动态定义标头(例如,不是在XAML中,而是在View类中动态地返回)?
小智 10
这也有效:
public class View : UserControl
{
public string ViewName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后在shell中:
<Window.Resources>
<Style TargetType="{x:Type TabItem}" x:Key="TabItemRegionStyle">
<Setter Property="Header" Value="{Binding RelativeSource={RelativeSource Self}, Path=Content.ViewName}" />
</Style>
</Window.Resources>
...
<TabControl cal:RegionManager.RegionName="RightRegion" Width="Auto" Height="Auto" HorizontalAlignment="Stretch" Grid.Column="2"
x:Name="RightRegion" ItemContainerStyle="{StaticResource TabItemRegionStyle}" />
Run Code Online (Sandbox Code Playgroud)
小智 7
尼斯.
您可以删除视图上的ViwewName属性,并将TabItem值的绑定更改为Value ="{Binding DataContext.HeaderInfo}"...其中HeaderInfo是DataContext对象的属性 - IE是Tab项的业务对象代表.这更优雅一点.
| 归档时间: |
|
| 查看次数: |
5105 次 |
| 最近记录: |