3

我有一个视图 DisplayTestsView.cs 并且在那个视图中我有

<ListView ItemsSource="{Binding SelectedTechnician.Tests}"
SelectedItem="{Binding SelectedTest}" x:Name="AvailableTestsListView" Height="140">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Id" Width="auto" DisplayMemberBinding="{Binding Id}"/>
            <GridViewColumn Header="Test" Width="auto" DisplayMemberBinding="{Binding TestTypeName}"/>
            <GridViewColumn Header="Status" Width="auto" DisplayMemberBinding="{Binding StutusTypeName}"/>
        </GridView>
    </ListView.View>
</ListView>

我希望 StatusTypeName 单元格文本的 TextColor 是基于条件的某种颜色。例如,如果 StatusTypeName 等于“Incomplete”,那么我希望单元格中的文本变为红色。

从视图中可以看到的测试(实体)列表是 SelectedTechnician.Tests 和 SelectedTechnician 是我的 ViewModel (DisplayTestsViewModel.

我想必须使用 GridViewColumn 上的 CellTemplate 属性,但对如何有条件地操作模板(通常)知之甚少,我不知道从哪里开始。

即使 CellTemplate 与它无关,我如何有条件地将 GridViewColumn 的单元格的文本设置为根据上述类似的条件更改颜色?

4

1 回答 1

5

您是正确的, CellTemplate 是实现颜色更改的正确位置。

你可以做这样的事情(警告 - 未经测试):

<ListView ItemsSource="{Binding SelectedTechnician.Tests}"
SelectedItem="{Binding SelectedTest}" x:Name="AvailableTestsListView" Height="140">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Id" Width="auto" DisplayMemberBinding="{Binding Id}"/>
            <GridViewColumn Header="Test" Width="auto" DisplayMemberBinding="{Binding TestTypeName}"/>
            <GridViewColumn Header="Status" Width="auto">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock
                            Text="{Binding StatusTypeName}"
                            Foreground="{Binding StatusTypeName, Converter={StaticResource StatusTypeNameToBrushConverter}}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
        </GridView>
    </ListView.View>
</ListView>

StatusTypeNameToBrushConverter会是这样的:

public class StatusTypeNameToBrushConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        var statusTypeName = (string)value;
        switch (statusTypeName)
        {
            case "Incomplete":
                return Brushes.Red;
            default:
                return Brushes.Black;
        }
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
于 2013-03-11T23:37:24.560 回答