根据wpf中的内容设置tabitem的标题

时间:2012-11-26 12:10:11

标签: wpf user-controls wpf-controls tabitem

最初我认为这将是一个非常微不足道的功能,但现在我无法实现它。

我的要求很简单。我是以编程方式设置TabItem的内容。内容将是用户控件。我想根据内容设置TabItem标题的文本。

内容没有更改事件,所以我对应该编写代码的事件感到困惑。

此外,我无法在网上找到任何风格或任何内容。

有什么建议吗?请帮忙。提前谢谢。

PS:如果您需要我方提供更多信息,请与我们联系。

4 个答案:

答案 0 :(得分:1)

如果您正在使用MVVM(或通过分配TabControl.ItemsSource来构建标签),那么操作很简单,只需定义ItemTemplate

<TabControl.ItemTemplate>
   <DataTemplate>
      <TextBlock Text={Bindin Name}/>
   </DataTemplate>
</TabControl.ItemTemplate>

答案 1 :(得分:1)

<强>更新
 您也可以使用DependencyPropertyDescriptor.AddValueChanged方法。看到: system.componentmodel.dependencypropertydescriptor.addvaluechanged.aspx

请参阅:wpf-why-is-there-no-isreadonlychanged-event-on-textbox-controls

另见此链接:listening-to-dependencyproperty-changes

我的回答:
创建自定义类并处理OnPropertyChanged事件。是这样的:

public class MyTabItem : TabItem
{
    public MyTabItem() { }
    protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        base.OnPropertyChanged(e);
        if (e.Property.ToString() == "Content")
        {
            // here you are sure that ContentPropertyhas changed
        }
    }
}

答案 2 :(得分:0)

我想我明白了。不确定这是否是最佳解决方案,所以如果有人有比这更好的解决方案,那么它将对我有很大的帮助。

我制作了一个自定义tabitem并覆盖OnContentChanged(Didnt知道有一个可覆盖的OnContentChanged :))。所以我的代码如下所示。


    public class TabItemData : TabItem
    {
        protected override void OnContentChanged(object oldContent, object newContent)
        {
            if (newContent.GetType().Name.ToLower().Contains("mycontrolname"))
                this.Header = "control name";
            else
                this.Header = "old name";

            base.OnContentChanged(oldContent, newContent);
        }
    }

答案 3 :(得分:0)

TabControl XAML:

<TabControl Name="myTabControl" >
    <TabItem Header="myHeader" Name="myTabItem">
        <my:customUserControl />
    </TabItem>
</TabControl>

在代码中绑定TabItem标头属性:

// Bind TabItem Header
// Create a binding to a "Header" property in your ViewModel
Binding myBinding = new Binding("Header"); 
// Set the Source of the binding to your ViewModel
myBinding.Source = myViewModel;
// Assign the Binding to your TabItem Header property
myTabItem.SetBinding(Expander.HeaderProperty, myBinding);