1

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

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

内容没有更改的事件,所以我很困惑我应该在哪个事件上编写代码。

我也无法在网上找到任何风格或任何东西。

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

PS:如果您需要我方面的任何进一步信息,请告诉我。

4

4 回答 4

1

如果您正在使用 MVVM(或通过分配来构建选项卡TabControl.ItemsSource),这很简单,只需定义一个ItemTemplate

<TabControl.ItemTemplate>
   <DataTemplate>
      <TextBlock Text={Bindin Name}/>
   </DataTemplate>
</TabControl.ItemTemplate>
于 2012-11-26T12:16:48.983 回答
1

更新:
您也可以使用DependencyPropertyDescriptor.AddValueChanged方法。参见: system.componentmodel.dependencypropertydescriptor.addvaluechanged.aspx

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

另请参阅此链接:监听依赖属性更改

我的旧答案:
创建一个自定义类并处理 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
        }
    }
}
于 2012-11-26T13:24:24.850 回答
0

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

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

    公共类 TabItemData : TabItem
    {
        protected override void OnContentChanged(object oldContent, object newContent)
        {
            if (newContent.GetType().Name.ToLower().Contains("mycontrolname"))
                this.Header = "控件名称";
            别的
                this.Header = "旧名称";

            base.OnContentChanged(oldContent, newContent);
        }
    }

于 2012-11-26T13:34:23.393 回答
0

TabControl XAML:

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

在代码中绑定TabItemHeader 属性:

// 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);
于 2012-11-26T13:34:36.647 回答