WPF Textwrapping触发ListView IsSelected状态

时间:2018-08-13 15:47:11

标签: c# wpf xaml listview textwrapping

我正在制作一个具有列表视图的xaml应用程序。当文本很长时,我正在使用textTrimming来缩短它,但是当用户单击该项目时,我希望TextWrapping属性从nowrap变为wrap。 这是我到目前为止的内容:

<Listview>
 <Listview.View>
   <GridView>
    <GridViewColumn Header="Name">
     <GridViewColumn.CellTemplate>
      <DataTemplate>
       <TextBlock x:Name="WordWrap" Text="{Binding Name}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis"></TextBlock>
      </DataTemplate>
     </GridViewColumn.CellTemplate>
    </GridViewColumn>
 </Listview.View>
</Listview> 

我有一个带有样式的单独的覆盖文件,即设置其他控件模板触发器和数据触发器,这是我在此处尝试过的内容:

<Style.Triggers>
  <DataTrigger Binding="{Binding IsSelected, ElementName=WordWrap}" Value="True">
   <Setter Property="TextWrapping" Value="Wrap" />
  </DataTrigger>
 </Style.Triggers>
</Gridview>

我收到此错误:成员“ TextWrapping”无法识别或访问。

请让我知道任何解决方案或修复!对于xaml和WPF来说还是很新。

2 个答案:

答案 0 :(得分:1)

TextBlock控件没有IsSelected属性,因此您的DataTrigger将永远不会原样发生。 IsSelected是包含的ListViewItem的属性,因此您可以使用RelativeSource将Trigger绑定更改为该绑定。例如:

<TextBlock x:Name="WordWrap" Text="{Binding}" TextTrimming="CharacterEllipsis">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="NoWrap"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}}" Value="True">
                    <Setter Property="TextWrapping" Value="Wrap"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

此外,为了更改触发器中的属性,不能在元素属性中对其进行硬编码,因此也要将原始TextWrapping也移到Style内。

答案 1 :(得分:0)

在关闭数据块之前,请先关闭textblock标签,然后再尝试在其中添加触发代码,除了将其更改为样式以外。