有条件地设置GridViewColumn单元格模板

时间:2013-03-11 23:20:08

标签: c# wpf mvvm

我有一个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 Cell文本的TextColor基于条件成为某种颜色。例如,如果StatusTypeName等于“Incomplete”,那么我希望单元格中的文本变为红色。

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

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

即使CellTemplate与它无关,我如何能够根据上述类似的条件分别设置GridViewColumn单元格的文本以改变颜色?

1 个答案:

答案 0 :(得分:4)

你是正确的,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();
    }
}