最初我认为这将是一个非常微不足道的功能,但现在我无法实现它。
我的要求很简单。我正在以编程方式设置TabItem
. 内容将是用户控件。我想根据TabItem
内容设置标题的文本。
内容没有更改的事件,所以我很困惑我应该在哪个事件上编写代码。
我也无法在网上找到任何风格或任何东西。
有什么建议么?请帮忙。提前致谢。
PS:如果您需要我方面的任何进一步信息,请告诉我。
最初我认为这将是一个非常微不足道的功能,但现在我无法实现它。
我的要求很简单。我正在以编程方式设置TabItem
. 内容将是用户控件。我想根据TabItem
内容设置标题的文本。
内容没有更改的事件,所以我很困惑我应该在哪个事件上编写代码。
我也无法在网上找到任何风格或任何东西。
有什么建议么?请帮忙。提前致谢。
PS:如果您需要我方面的任何进一步信息,请告诉我。
如果您正在使用 MVVM(或通过分配来构建选项卡TabControl.ItemsSource
),这很简单,只需定义一个ItemTemplate
:
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text={Bindin Name}/>
</DataTemplate>
</TabControl.ItemTemplate>
更新:
您也可以使用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
}
}
}
我想我明白了。不确定这是否是最佳解决方案,所以如果有人有比这更好的解决方案,那么它将对我有很大帮助。
我做了一个自定义的 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); } }
TabControl XAML:
<TabControl Name="myTabControl" >
<TabItem Header="myHeader" Name="myTabItem">
<my:customUserControl />
</TabItem>
</TabControl>
在代码中绑定TabItem
Header 属性:
// 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);