代码之家  ›  专栏  ›  技术社区  ›  David Schmitt

如何从ContentTemplate绑定到周围的自定义控件?

  •  6
  • David Schmitt  · 技术社区  · 16 年前

    我有以下用户控件:

    <TabItem 
        x:Name="Self"
        x:Class="App.MyTabItem"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:App"
        >
        <TabItem.Header>
            <!-- This works -->
            <TextBlock Text="{Binding ElementName=Self, Path=ShortLabel, UpdateSourceTrigger=PropertyChanged}"/>
        </TabItem.Header>
        <TabItem.ContentTemplate>
            <DataTemplate>
                <!-- This binds to "Self" in the surrounding window's namespace -->
                <TextBlock Text="{Binding ElementName=Self, Path=ShortLabel, UpdateSourceTrigger=PropertyChanged}"/>
    

    DependencyProperty “ShortLabel”来实现接口。我想从内部绑定到这个和其他属性 TabItem DataTemplate . 但由于奇怪的相互作用 TextBlock 被绑定到 父容器 标签项目 ,也称为“Self”,但在另一个Xaml文件中定义。

    为什么装订工作在TabItem.标题,但不是从内部TabItem.ContentTemplate,以及如何继续从DataTemplate中获取用户控件的属性?

    我已经试过了

    • TemplateBinding 标签项目 .
    • FindAncestor, AncestorType={x:Type TabItem} :找不到 标签项目 起源。当我指定 MyTabItem
    • ElementName=Self :尝试绑定到错误作用域中具有该名称的控件(不是父容器,而是父容器) 标签项目 ). 我认为这给出了一个提示,为什么这不起作用:DataTemplate不是在XAML中定义的位置创建的,而是由父容器创建的。

    我想我可以把整个 ControlTemplate 为了达到我想要的效果,但是因为我想保留 标签项目 不需要维护整个系统 ,我很不愿意这么做。

    同时我发现问题是: TabControl 不可能有(任何) ItemsTemplate (包括 DisplayMemberPath )如果 ItemsSource 包含 Visual s、 在那里 a thread on MSDN Forum explaining why

    既然这似乎是WPF的TabControl的一个基本问题,我就结束这个问题。谢谢你的帮助!

    2 回复  |  直到 11 年前
        1
  •  1
  •   Bob King    16 年前

    试试这个。我不确定它是否有效,但是

    <TabItem 
        x:Name="Self"
        x:Class="App.MyTabItem"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:App"
        >
        <TabItem.ContentTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=ShortLabel}"/>
            </DataTemplate>
        </TabItem.ContentTemplate>
    </TabItem>
    

    DataContext="{Binding RelativeSource={RelativeSource self}}"
    
        2
  •  1
  •   Todd White    16 年前

    问题似乎在于,您使用的是ContentTemplate,而没有实际使用content属性。ContentTemplate的DataTemplate的默认DataContext是TabItem的Content属性。然而,我所说的一切都无法解释 为什么?

    所以,在你的情况下,我会把代码改成这样:

    <TabItem
        x:Class="App.MyTabItem"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:App"
        Header="{Binding ShortLabel, RelativeSource={RelativeSource Self}}"
        Content="{Binding ShortLabel, RelativeSource={RelativeSource Self}}" />
    

    如果ShortLabel是一个更复杂的对象,而不仅仅是一个字符串,那么您需要生成一个ContentTemplate:

    <TabItem
        x:Class="App.MyTabItem"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:app="clr-namespace:App"
        Header="{Binding ShortLabel, RelativeSource={RelativeSource Self}}"
        Content="{Binding ComplexShortLabel, RelativeSource={RelativeSource Self}}">
        <TabItem.ContentTemplate>
            <DataTemplate TargetType="{x:Type ComplexType}">
                <TextBlock Text="{Binding Property}" />
            </DataTemplate>
        </TabItem.ContentTemplate>
    </TabItem>