Сетка данных WPF: отключить редактирование в определенных строках

У меня есть что-то вроде таблицы заказов, привязанной к DataGrid. Я хочу отключить редактирование строк, в которых срок действия заказа истек (дата крайнего срока> текущая дата): показать их серым цветом и запретить вход в режим редактирования.

Вот что у меня есть:

<Style TargetType="{x:Type WPFToolkit:DataGridRow}">
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <!-- ??? order_date > current_date -->
                <!-- some other condition - already works -->
            </MultiTrigger.Conditions>
            <Setter Property="IsEnabled" Value="False"/>
            <Setter Property="Foreground" Value="LightGray"/>
        </MultiTrigger>
    </Style.Triggers>
</Style>

Дата заказа — это столбец шаблона, определяемый следующим образом:

<WPFToolkit:DataGridTemplateColumn SortMemberPath="order_date" Header="Deadline" >
    <WPFToolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=order_date,  
                ConverterCulture='ru-RU', StringFormat='{}{0:d}'}" />
        </DataTemplate>
    </WPFToolkit:DataGridTemplateColumn.CellTemplate>
    <WPFToolkit:DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <WPFToolkit:DatePicker SelectedDate="{Binding Path=order_date}" />
        </DataTemplate>
    </WPFToolkit:DataGridTemplateColumn.CellEditingTemplate>
</WPFToolkit:DataGridTemplateColumn>

Есть ли способ отключить режим редактирования в строках, где срок действия заказа истек?


person jonny    schedule 17.12.2009    source источник
comment
Связано: stackoverflow.com/questions /2030143/   -  person surfen    schedule 12.01.2012


Ответы (1)


Итак, кажется, что все работает, но вам нужен способ проверить (order_date > current_date) в триггере? Если это так, вы можете написать ValueConverter, например DateExpiredConverter, проверить там условие и вернуть логическое значение.

Класс преобразователя может выглядеть примерно так:

public class DateExpiredConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        DateTime order_date = (DateTime)value;

        if (order_date > System.DateTime.Now)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

Затем в своем триггере вы делаете что-то вроде этого:

<Style TargetType="{x:Type WPFToolkit:DataGridRow}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=order_date, Converter={StaticResource DateExpiredConverter}}" Value="True">
                <Setter Property="IsEnabled" Value="False"/>
                <Setter Property="Foreground" Value="LightGray"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

Я не тестировал этот код, но он должен быть довольно близок к тому, что вам нужно.

person Ben Collier    schedule 17.12.2009
comment
Спасибо! Вы спасли мой день. вернуть order_date › DateTime.Now ;) - person jonny; 17.12.2009