Binding ElementName生成空字符串

时间:2015-07-23 18:29:24

标签: c# wpf xaml listview elementname

我有一个Datagrid,它有一个DataGridTemplateColumn,其中包含一个ListView,其Itemsource绑定到一个字符串数组。

在ListView中我定义了一个ItemTemplate,因为我希望列表中每个项目的前景依赖于条件 - 所以它应用于TextBlock。

我希望在ListView中的每个项目悬停时显示工具提示,因此我在该TextBlock中定义了一个工具提示

我要做的是让工具提示通过使用转换器显示特定项目的标题/详细信息(以获取不同列表中项目的索引)。

为此,我需要工具提示来了解ListView项目,但我似乎无法使其工作。 TextBlock本身使用Path=.检索它,我尝试命名TextBlock ListItem并将其作为ElementName检索无效 - 结果只是空字符串。

这是相关的xaml(删除了格式化属性)。

<ListView.ItemTemplate>
    <DataTemplate>
        <TextBlock x:Name="ListItem" Text="{Binding Path=.}" Foreground="{Binding RelativeSource={RelativeSource Self}, Path=Text, Converter={StaticResource ConvertItemToColour}}">
            <TextBlock.ToolTip>
                <ToolTip>
                    <StackPanel Orientation="Vertical">
                        <Label>
                            <TextBlock Text="{Binding ElementName=ListItem, Path=Text, Converter={StaticResource ConvertItemToTitle}}"/> <!-- Item Title -->
                        </Label>
                        <Label>
                            <TextBlock/> <!-- Item Description -->
                        </Label>
                    </StackPanel>
                </ToolTip>
            </TextBlock.ToolTip>
        </TextBlock>
    </DataTemplate>
</ListView.ItemTemplate>

1 个答案:

答案 0 :(得分:1)

ToolTiplike Popup不属于主要可见树,因此ElementNameRelativeSource绑定都不会超出ToolTipDataContext } ToolTip内部应与ListViewItem

相同
<ToolTip>
   <StackPanel Orientation="Vertical">
      <Label>
         <TextBlock Text="{Binding Path=., Converter={StaticResource ConvertItemToTitle}}"/>
      </Label>
   </StackPanel>
</ToolTip>

Text="{Binding Path=.}"应该在ToolTip DataTemplate内为您提供与 menuModel = new DynamicMenuModel(); DefaultSubMenu inOfficeMailbox = new DefaultSubMenu("#{msg['inofficemailbox']}"); DefaultMenuItem activeItem = new DefaultMenuItem( "#{msg['activeissues']}"); activeItem.setCommand("#{mainMenuMB.loadContent('activeissues')}"); inOfficeMailbox.addElement(activeItem); DefaultMenuItem resolvedItem = new DefaultMenuItem("#{msg['resolvedissues']}"); resolvedItem.setCommand("#{mainMenuMB.loadContent('resolvedissues')}"); inOfficeMailbox.addElement(resolvedItem); menuModel.addElement(inOfficeMailbox);

相同的结果