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

Isa*_*son 3 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

dev*_*xer 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>
Run Code Online (Sandbox Code Playgroud)

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();
    }
}
Run Code Online (Sandbox Code Playgroud)