WPF Datagrid не учитывает изменение значения свойства элемента - PullRequest
0 голосов
/ 18 декабря 2009

моя проблема здесь: У меня есть класс

public class Component
{
    ...
    private ServiceController service;

    ...
    public int ServiceStatus
    {
        get
        {
            switch(service.Status)
            {
                case ServiceControllerStatus.Stopped:
                    return 0;

                case ServiceControllerStatus.Running:
                    return 1;

                default:
                    return 2;
            }
        }
    }
    public void QueryService()
    {
        service.Refresh();
    }
}

и набор Компонентов, объявленных в другом классе:

public class Motivation
{
    // Downloaded data
    ...
    private ObservableCollection<Component> components;
    public ObservableCollection<Component> Components
    {
        get { return components; }
    }

    public bool CheckServices()
    {
        bool changed = false;
        foreach (Component C in components)
        {
            int prevStatus = C.ServiceStatus;
            C.QueryService();

            if (prevStatus != C.ServiceStatus)
                changed = true;
        }

        return changed;
    }

Этот список компонентов отображается в WPF DataGrid. Моя идея: зеленый цвет фона для запущенных сервисов, красный - для остановленных. Работает нормально, но только на старте. CheckServices () вызывается по таймеру, и если возвращаемое значение равно True, я хочу переопределить свою сетку, учитывая новые статусы обслуживания. Вот XAML:

<Style x:Key="ServiceStateStyle" TargetType="z:DataGridRow">
        <Setter Property="Background" Value="Gray" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=ServiceStatus}" Value="0">
                <Setter Property="Background" Value="LightCoral" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=ServiceStatus}" Value="1">
                <Setter Property="Background" Value="LightGreen" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
    <z:DataGrid Grid.Row="0"
                Grid.ColumnSpan="4"
                AutoGenerateColumns="False"
                x:Name="DataGridComponents"
                ItemContainerStyle="{DynamicResource ServiceStateStyle}">
                <z:DataGrid.Columns>
                        <z:DataGridTextColumn IsReadOnly="True"
                            Header="Component" Width="80"
                            Binding="{Binding Path=DisplayName}"/>
                    </z:DataGrid.Columns>
                </z:DataGrid>

Должен ли я вызвать какой-либо явный метод для аннулирования DataGrid? Я пытался с InvalidateProperty, InvalidateVisual, GetBindingExpression (ItemContainerStyleProperty) .UpdateTarget (), но ничего не работает. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 18 декабря 2009

Класс Component должен реализовывать INotifyPropertyChanged и вызывать событие при изменении части его свойства.

...