最初我认为这将是一个非常微不足道的功能,但现在我无法实现它。
我的要求很简单。我是以编程方式设置TabItem
的内容。内容将是用户控件。我想根据内容设置TabItem
标题的文本。
内容没有更改事件,所以我对应该编写代码的事件感到困惑。
此外,我无法在网上找到任何风格或任何内容。
有什么建议吗?请帮忙。提前谢谢。
PS:如果您需要我方提供更多信息,请与我们联系。
答案 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);