繁体   English   中英

自定义TabItem属性(TabItem.Content和TabItem.Header)

[英]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.HeaderMyTabItem.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM