Wpf - 文本块颜色在随机输入时逐列变化

Wpf - Textblock color change column wise on random input

目前这是我的 XAML 列表视图: 我已经做了很多搜索,但我找不到解决这个问题的方法,我们将不胜感激,谢谢。

<ListView x:Name="listView_data" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="20,0,20,5" Width="712" Height="357">
        <ListView.View>
            <GridView x:Name="lvgvc">
                <TextBlock.Foreground>
                    <SolidColorBrush Color="black"></SolidColorBrush>
                </TextBlock.Foreground>
            </GridView>
        </ListView.View>
    </ListView>

这是代码隐藏:

    //received data in DataTable (dt)
    for(int i=0; i < dt.Columns.Count; i++)
                    {
                        GridViewColumn gvc = new GridViewColumn();
                        gvc.Header = "Column"+i;
                        gvc.Width = 100;
                        gvc.DisplayMemberBinding = new Binding("column"+i);
                        lvgvc.Columns.Add(gvc);      
                    }

                listView_data.Items.Clear();
                listView_data.ItemsSource = dt.DefaultView;

Listview 创建列并填充 datatTable。但是行完全是白色的。我可以 select listview 中的 6 行,因为 dataTable 中有 6 行,并且在调试 DataTable 时显示其中的正确数据。我怎样才能使列表视图中的文本块颜色变黑。我想要根据随机输入列的文本块。

DisplayMemberBinding 的路径应设置为列名:

for (int i = 0; i < dt.Columns.Count; i++)
{
    GridViewColumn gvc = new GridViewColumn();
    gvc.Header = "Column" + i;
    gvc.Width = 100;
    gvc.DisplayMemberBinding = new Binding(dt.Columns[0].ColumnName);
    lvgvc.Columns.Add(gvc);
}

listView_data.Items.Clear();
listView_data.ItemsSource = dt.DefaultView;

并且可以通过在 XAML 标记中定义 ItemContainerStyle 来更改列中文本的颜色:

<ListView x:Name="listView_data">
    <ListView.View>
        <GridView x:Name="lvgvc"/>
    </ListView.View>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Foreground" Value="Black" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

如果您希望在不同的列中使用不同的颜色,您可以通过编程方式为每一列创建一个 DataTemplate:

const string dataTemplate = "<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><TextBlock Text=\"{{Binding  {0}}}\" Foreground=\"{1}\" /></DataTemplate>";

for (int i = 0; i<dt.Columns.Count; i++)
{
    string colour = "Green"; ///change this one based on your colouring logic...
    DataTemplate template = System.Windows.Markup.XamlReader.Parse(string.Format(dataTemplate, dt.Columns[0].ColumnName, colour)) as DataTemplate;
    GridViewColumn gvc = new GridViewColumn() { CellTemplate = template };
    gvc.Header = "Column" + i;
    gvc.Width = 100;
    lvgvc.Columns.Add(gvc);
}

listView_data.Items.Clear();
listView_data.ItemsSource = dt.DefaultView;