【问题标题】:set header of tabitem based on content in wpf根据 wpf 中的内容设置 tabitem 的标题
【发布时间】:2012-11-13 21:56:57
【问题描述】:

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

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

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

而且我在网上找不到任何款式或任何东西。

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

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

【问题讨论】:

  • 请提供您已经尝试过的任何代码/xaml。
  • 设置TabItem的内容时,为什么不设置header的内容?
  • @Ron;我可以这样做,但内容设置在多个地方,所以我必须重复代码很多地方。此外,如果添加了任何其他用户控件,那么开发人员将有额外的负担记住添加该代码。

标签: wpf user-controls wpf-controls tabitem


【解决方案1】:

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

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

【讨论】:

  • 实际上我只是将用户控件对象分配给内容。 Tabcontrol 已经在 xaml 中硬编码了一个 tabitem。像这样的“tabitem1.Content = objUserControl;”所以我们没有将任何 ItemsSource 分配给 tabcontrol。 :(
  • 请显示一些代码,我相信也可以处理,我只需要看一些代码
【解决方案2】:

更新:
您也可以使用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
        }
    }
}

【讨论】:

    【解决方案3】:

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

    我制作了一个自定义 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); } }

    【讨论】:

      【解决方案4】:

      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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 2012-09-07
        • 2010-12-08
        • 2011-04-18
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        相关资源
        最近更新 更多