WPF-使用DisplayMemberBinding将工具提示添加到GridViewColumn

我在TextBlock内有一个gridviewcolumn,它需要一个DisplayMemberBinding。由于TextBlock的优先级高于DisplayMemberBinding,因此CellTemplate完全无法说明。但是,Textblock有一个我想显示的ToolTip,该列特定于该列本身。我能够将大多数样式设置移到CellTemplate之外,因为它们对于所有列都是通用的,但是ToolTip不能被带到外面,因为它需要绑定并且对于每个列都是唯一的。

此处是各列之一。由于gridviewcolumn.CellTemplate具有优先权,DisplayMemberBinding标记内的所有内容都可删除。

            <gridviewcolumn Header="Templates"
                            Width="200" 
                            DisplayMemberBinding="{Binding Path=Name}>
              <gridviewcolumn.CellTemplate> 
                <DataTemplate DataType="{x:Type request:ModelDocument}">
                  <TextBlock ToolTip="{Binding Name}"/>
                </DataTemplate>
              </gridviewcolumn.CellTemplate>
            </gridviewcolumn>

我完成其他样式属性的方式如下。这是在GridViewGridViewListView的子代)之前完成的:

        <ListView.Resources>
          <Style TargetType="TextBlock">
            <Setter Property="TextTrimming" Value="CharacterEllipsis" />
            <Setter Property="TextWrapping" Value="NoWrap"/>
            <Setter Property="FontFamily" Value="Segue UI Light" />
            <Setter Property="FontSize" Value="13" />
          </Style>
        </ListView.Resources>

如何在不删除ToolTip的情况下为每列添加唯一的DisplayMemberBinding

totaleather2009 回答:WPF-使用DisplayMemberBinding将工具提示添加到GridViewColumn

正如@icebat的评论中已经建议的那样,DataGrid更适合于这种情况,这里为了澄清一个简单的演示实现:

   <DataGrid ItemsSource="{Binding Collection}" AutoGenerateColumns="False">
    <DataGrid.Resources>
        <Style TargetType="TextBlock" x:Key="TbStyle">
            <Setter Property="TextTrimming" Value="CharacterEllipsis" />
            <Setter Property="TextWrapping" Value="NoWrap"/>
            <Setter Property="FontFamily" Value="Segue UI Light" />
            <Setter Property="FontSize" Value="13" />
        </Style>

    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn  Header="Templates" SortMemberPath="Name"
                         Width="200"  >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate >
                    <TextBlock Style="{StaticResource TbStyle}" ToolTip="{Binding Name}" Text="{Binding Name}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>

        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
,

即使有更合适的解决方案,例如使用DataGrid而不是ListView,我也想展示一个答案,使您可以完全按照自己的意愿做 ListView上有DisplayMemberBindingToolTipTextBlocks

最后,我有以下XAML:

<ListView ItemsSource="{Binding MyList}">
    <ListView.Resources>
        <local:GridRowPresenterToDataContextPropertiesConverter x:Key="GridRowPresenterToDataContextPropertiesConverter"></local:GridRowPresenterToDataContextPropertiesConverter>
        <Style TargetType="TextBlock">
            <Setter Property="TextTrimming" Value="CharacterEllipsis" />
            <Setter Property="TextWrapping" Value="NoWrap"/>
            <Setter Property="FontFamily" Value="Segue UI Light" />
            <Setter Property="FontSize" Value="13" />

            <!--THIS IS THE NEW PART-->

            <Setter Property="ToolTip">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource GridRowPresenterToDataContextPropertiesConverter}"
                                  ConverterParameter="Name,Value">
                        <Binding RelativeSource="{RelativeSource Mode=FindAncestor,AncestorType=GridViewRowPresenter}"/>
                        <Binding RelativeSource="{RelativeSource Mode=Self}"/>
                    </MultiBinding>
                </Setter.Value>
            </Setter>

            <!--END OF THE NEW PART-->

        </Style>
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Templates" Width="200" DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Templates" Width="200" DisplayMemberBinding="{Binding Value}"/>
        </GridView>
    </ListView.View>
</ListView>

我添加了一个简单的视图模型类和另一个GridViewColumn进行测试:

public class MyViewModel {
    public string Name { get; set; } = "Hello.";
    public string Value { get; set; } = "world.";
}

此XAML会将第一列中所有Name的{​​{1}}的{​​{1}}属性设置为DataContext,并将{第二列中所有ToolTip的{​​1}}与TextBlocks相同。您可以通过将属性添加到Value的有序列表中来处理其他列。

关键在于DataContext的定义(这是我可能写过的最简单,最易懂的ToolTip之一)

TextBlocks

此转换器获取目标元素(这里是每个ConverterParameter="Name,Value"),找出GridRowPresenterToDataContextPropertiesConverter的哪一列是生命,并从{{1 }}。

尽管这个答案的编写比起在生产代码中的使用更有趣,但它需要一些更聪明的代码来处理列的重新排序,而现在绝对不支持。

本文链接:https://www.f2er.com/3117519.html

大家都在问