具有virutlaziation超链接的DataGrid +列中的普通文本

时间:2017-09-19 10:27:35

标签: c# wpf xaml datagrid

我必须在DataGrid列中显示文本和超链接。 为此,我创建了一个带有TextBlock的DataTemplateColumn。 在此文本块中,我使用相应的值填充Inlines属性。 一旦我在网格中向下滚动并且TextBlock不在视线范围内,所有内容都会正确显示,列中最底部的TextBlock将填充上一个相同的内联值。 如果我在网格中禁用虚拟化,一切正常。

如果为此方案创建了一个简短示例。

XAML:

<Window x:Class="TextBlockInDatagridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TextBlockInDatagridTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <DataGrid AutoGenerateColumns="False" Name="dgHaupt" IsReadOnly="True">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Test" Width="150">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Loaded="FrameworkElement_OnLoaded" Tag="{Binding Test}"></TextBlock>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

代码背后:

public partial class MainWindow : Window
  {
    public MainWindow()
    {
      InitializeComponent();

      List<Data> systems = new List<Data>();

      for (int i = 0; i < 100; ++i)
      {
        systems.Add(new Data() { Test = i });
      }

      this.dgHaupt.ItemsSource = systems;

    }

    private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
    {
      TextBlock textBlock = sender as TextBlock;
      if (textBlock == null || (int)textBlock.Tag != 7)
      {
        return;
      }

      textBlock.Inlines.Clear();
      textBlock.Inlines.Add(new Run("test")
      {
        FontStyle = FontStyles.Italic
      });
    }
  }
struct Data
  {
    public int Test { get; set; }
  }

感谢所有的人。

1 个答案:

答案 0 :(得分:0)

您应该禁用虚拟化或在Run中定义DataTemplate元素并使用数据绑定:

<DataGrid AutoGenerateColumns="False" Name="dgHaupt" IsReadOnly="True">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Test" Width="150">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock>
                        <Run>
                            <Run.Style>
                                <Style TargetType="Run">
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Test}" Value="7">
                                            <Setter Property="Text" Value="Text" />
                                            <Setter Property="FontStyle" Value="Italic" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Run.Style>
                        </Run>
                    </TextBlock>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>