我在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>
我完成其他样式属性的方式如下。这是在GridView
(GridView
是ListView
的子代)之前完成的:
<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
?
答案 0 :(得分:3)
正如@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>
答案 1 :(得分:0)
即使有更合适的解决方案,例如使用DataGrid
而不是ListView
,我也想展示一个答案,使您可以完全按照自己的意愿做 ListView
上有DisplayMemberBinding
,ToolTip
和TextBlocks
。
最后,我有以下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 }}。
尽管这个答案的编写比起在生产代码中的使用更有趣,但它需要一些更聪明的代码来处理列的重新排序,而现在绝对不支持。