C# WPF DataGrid Промяна на цвета на клетките по стойност

Аз съм нов в WPF и се опитвам да подчертая клетките на Datagrid по тяхната стойност. Заредих списък с елементи в DataGrid и искам да маркирам всички грешни входни стойности (представени като стойност "0"):

въведете описание на изображението тук


person Erez Konforti    schedule 19.09.2015    source източник
comment
Задайте правила за проверка за вашите DataGrid клетки Как за: Прилагане на проверка с DataGrid Control   -  person Mrg Gek    schedule 19.09.2015


Отговори (1)


Направих проста проба, за да ви насоча как може да се направи

Xaml код

<DataGrid x:Name="dataGrid" IsEnabled="True" CanUserAddRows="False" AutoGenerateColumns="False" Width="275" HorizontalAlignment="Left">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID" Binding="{Binding ID}" Width="25"/>
        <DataGridTextColumn Header="Weight" Binding="{Binding Weight}" Width="25"/>
        <DataGridTextColumn Header="Quantity" Binding="{Binding Quantity}" Width="25"/>
        <DataGridTemplateColumn Header="Length" Width="25">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Length, UpdateSourceTrigger=LostFocus}">
                        <TextBox.Style>
                            <Style TargetType="{x:Type TextBox}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding Path=Length}" Value="0">
                                        <Setter Property="BorderBrush" Value="Red"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </TextBox.Style>
                    </TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="Height" Binding="{Binding Height}" Width="25"/>
        <DataGridTextColumn Header="Width" Binding="{Binding Width}" Width="25"/>
        <DataGridTextColumn Header="X" Binding="{Binding X}" Width="25"/>
        <DataGridTextColumn Header="Y" Binding="{Binding Y}" Width="25"/>
        <DataGridTextColumn Header="Z" Binding="{Binding Z}" Width="25"/>
    </DataGrid.Columns>
</DataGrid>

Кодът отзад

public partial class MainWindow : Window
{
    public ObservableCollection<Model> Source { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        Source = new ObservableCollection<Model>
        {
            new Model {ID=1,Weight=3,Quantity=5,Length=11,Height=12,Width=0,X=1,Y=-1,Z=-1 },
            new Model {ID=2,Weight=21,Quantity=23,Length=0,Height=23,Width=11,X=-1,Y=-1,Z=-1 }
        };
        dataGrid.ItemsSource = Source;
    }
}

РЕДАКТИРАНЕ Просто добавете UpdateSourceTrigger в TextBox в рамките на DataTemplate

person Sandesh    schedule 19.09.2015
comment
съжалявам, един допълнителен въпрос, как мога да демаркирам клетката, след като потребителят редактира клетката до валидна стойност? (по-голямо от нула) - person Erez Konforti; 19.09.2015
comment
Сандеш, съжалявам, че те безпокоя отново, но имам малък проблем с този подход. Имам DataGrid, чиито всички колони са DataGridTemplateColumn с този тригер. Единственият начин да работи и да актуализира елемента и цвета на клетката е, ако имам допълнителна TextColumn и също я редактирам. Знаете ли начин да го заобиколите? - person Erez Konforti; 10.10.2015
comment
Няма код, просто трябва да добавя обикновена колона в допълнение към DataGridTemplateColunn и да я редактирам също.. Временно я направих колона с квадратче за отметка, така че потребителят да проверява редовете, които актуализира, докато намеря по-добро решение.. Когато премахна тази колона и останете само с колоните с шаблони, няма да работи.. - person Erez Konforti; 11.10.2015
comment
DataTemplate на всяко DataGridTemplateColumn е TextBox? Ако не, тогава можете ли да предоставите xaml частта от вашия DataGrid, за да мога да получа ясна представа какво се обърка - person Sandesh; 12.10.2015
comment
всяка колона е дефинирана, както ми дадохте, не мога да добавя xml тук, защото е твърде дълъг, но направих точно както показахте в отговора си, копирайте и поставете. - person Erez Konforti; 13.10.2015
comment
Понастоящем няма начин за повторно използване на DataTrigger, тъй като всяка клетка може да има различно условие за задействане на стила. Ще се опитам да помисля дали имам някакви решения, за да видя дали обща дефиниция на стил може да се погрижи за стиловете, ако се задействат. - person Sandesh; 13.10.2015