
[英]Add multiple datatable and tabitem.content for each tabitem in tabcontrol
[英]Custom TabItem properties (TabItem.Content and TabItem.Header)
我正在尝试从System.Windows.Controls.TabItem类继承MyTabItem
。 问题是,原始的TabItem
具有通用object
类型的属性:
public object Header;
public object Content;
我试图用不同的类型将这些属性隐藏在派生类中。
public class MyTabItem: TabItem
{
public new MyTabHeader Header;
public new MyTabContent Content;
}
这样,我无需类型转换即可访问MyTabItem.Header
和MyTabItem.Content
。
这个想法很不错,并且代码可以正确编译。 但是,当应用程序启动时,我看到空控件(没有错误报告)。 当我删除这些行并使用基类属性时,它可以正常工作。
当然,我可以添加两个附加属性,这些属性将在内部返回(MyTabHeader)Header
转换的(MyTabHeader)Header
或(MyTabContent)Header
,但这似乎有点多余。
我在问是否还有其他方法可以正确实现这些属性,因此它们实际上可以在我的应用程序中工作。
这与使用WPF的设计完全相反。 您的XAML对象应该被松散地绑定到数据,在大多数情况下,您甚至不需要创建自定义控件。 您正在执行此操作,然后尝试用自己的类型安全版本替换成员的事实,这意味着您的视图代码和视图逻辑代码不再分开,这将使您感到头疼轨道。
如果需要动态制表,那么一种方法是首先声明一个代表您的页面的抽象类,并从中派生页面类型:
public interface IBasePage
{
string Header { get; }
}
public class MyPageA : ViewModelBase, IBasePage
{
public string Header { get { return "Page A"; } }
}
public class MyPageB : ViewModelBase, IBasePage
{
public string Header { get {return "Page B";} }
}
public class MyPageC : ViewModelBase, IBasePage
{
public string Header { get {return "Page C";} }
}
然后,您的视图模型(应将窗口DataContext设置为该模型)应包含您希望显示的选项卡式页面的集合:
public class MyViewModel : ViewModelBase
{
private IEnumerable<IBasePage> _MyPages = new List<IBasePage>(){
new MyPageA(),
new MyPageB(),
new MyPageC()
};
public IEnumerable<IBasePage> MyPages {get {return this._MyPages;}}
}
然后,您的XAML中的tab控件被松散地绑定到此,并且应包含TabItem(因此它知道要用于标题等的文本)和DataTemplates的样式,以便其知道如何呈现您拥有的每种页面类型创建:
<TabControl ItemsSource="{Binding MyPages}" SelectedItem="{Binding MyPages[0], Mode=OneTime}">
<TabControl.Resources>
<!-- TabItem style -->
<Style TargetType="{x:Type TabItem}">
<Setter Property="Header" Value="{Binding Header}" />
</Style>
<!-- Content templates -->
<DataTemplate DataType="{x:Type local:MyPageA}">
<TextBlock Text="This is page A" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:MyPageB}">
<TextBlock Text="This is page B" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:MyPageC}">
<TextBlock Text="This is page C" />
</DataTemplate>
</TabControl.Resources>
</TabControl>
最终结果是一个常规的制表符控件,该控件完全由数据驱动,并已绑定到您已经强类型化的模型上:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.