绑定到转换器到ListBox的DataTemplate中的控件

时间:2011-10-28 06:24:33

标签: wpf data-binding

我正在尝试通过绑定

将TextBlock传递给转换器
<DataTemplate>
    <Grid>
        <DockPanel LastChildFill="False" x:Name="dpInfo">
            <Image Source = "{Binding Data.Picture}" Height="42" HorizontalAlignment="Left" Stretch="Uniform" VerticalAlignment="Center" Width="32" Margin="16,0,0,0" DockPanel.Dock="Left"/>
            <TextBlock Text= "{Binding Data.Name}" x:Name="tbUserName" VerticalAlignment="Center" Padding="10,0,0,0" TextTrimming="CharacterEllipsis" DockPanel.Dock="Left"/>
            <TextBlock Text=  "{Binding Data.ScribbleCount, StringFormat=' ({0})', Mode=TwoWay}" VerticalAlignment="Center" DockPanel.Dock="Left"/>
        </DockPanel>
        <Rectangle x:Name="rctClickableArea" MouseLeftButtonDown="User_MouseLeftButtonDown" Fill="Black" Opacity="0">
            <Rectangle.ToolTip>
                <ToolTip DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={x:Static RelativeSource.Self}}">
                    <ToolTip.Visibility>
                        <MultiBinding Converter="{StaticResource TooltipVisibilityConverter}">
                            <MultiBinding.Bindings>
                                <Binding Path="Data.Name"/>
                                <Binding ElementName="tbUserName"/>
                            </MultiBinding.Bindings>
                        </MultiBinding>
                    </ToolTip.Visibility>

                    <TextBlock Text="{Binding Data.Name}"/>

                </ToolTip>
            </Rectangle.ToolTip>
        </Rectangle>
    </Grid>
</DataTemplate>

对DataContext(Binding Path =“Data.Name”)的绑定有效,但绑定(Binding ElementName =“tbUserName”)不起作用,其中tbUserName是dbInfo DockPanel中的TextBlock。您对如何正确绑定这个有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可能遇到两个问题......

NameScoping ...

ElementName绑定对NameScoping ...

有严格的限制
  

基本上,当使用ElementName时   在绑定中,目标对象的NameScope用于定位   具有指定名称的元素。如果该元素没有   NameScope专门针对它,FrameworkElement.FindScope方法   继续逻辑树并回退到继承   上下文,如果没有逻辑父。名称范围是对象   所有已命名的对象都已注册。

因此,在您的情况下,ToolTip上下文之外的引用元素失败。现在为了使其正常工作,您必须使用Tag属性...

之类的东西来弥合损坏的范围
 <Rectangle Tag="{Binding ElementName tbUserName}" ...>
    <Rectangle.ToolTip>
       <ToolTip ...>
          <ToolTip.Visibility ... >
             <MultiBinding>
                 <Binding Path="Data.Name" />
                 <Binding Path="Tag"
                          RelativeSource="{RelativeSource
                             AncestorType={x:Type Rectangle}}" ...>

工具提示的可见性

您可以使用数据触发器对矩形本身进行多重绑定,并根据条件值设置所需的工具提示,而不是绑定到工具提示的可见性...

    <Window.Resources>
       <local:TooltipVisibilityConverter x:Key="TooltipVisibilityConverter"/>
       <TextBlock x:Key="MyToolTip" Text="{Binding Data.Name}"/>
     </Window.Resources>

    <!-- Rest of the code --->

    <Rectangle.Style>
        <Style TargetType="{x:Type Rectangle}">
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                          <MultiBinding
                                Converter="{StaticResource
                                   TooltipVisibilityConverter}">
                                <MultiBinding.Bindings>
                                    <Binding Path="Data.Name"/>
                                    <Binding ElementName="HelloTB"/>
                                </MultiBinding.Bindings>
                            </MultiBinding> 
                        </DataTrigger.Binding>
                        <Setter Property="ToolTip"
                                Value="{StaticResource MyToolTip}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
    </Rectangle.Style>

请注意,为了简单起见,TooltipVisibilityConverter现在返回一个布尔值。