WPF 数据网格 : disable editing in certain rows

标签 wpf xaml datagrid wpfdatagrid editing

我有类似订单表的东西绑定(bind)到 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>

有没有办法在订单日期已过期的行中禁用编辑模式?

最佳答案

所以似乎一切正常,但您需要一种方法来检查触发器中的 (order_date > current_date)?如果是这种情况,您可以编写一个 ValueConverter,比如 DateExpiredConverter 并检查那里的条件并返回一个 bool 值。

转换器类可能看起来像这样:

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>

我还没有测试过这段代码,但它应该非常接近你的需要。

关于WPF 数据网格 : disable editing in certain rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1921131/

相关文章:

c++ - 使用 Composition API 通过 C++ UWP 应用程序在 XAML Canvas 上绘制对象

wpf - 我可以以编程方式向 WPF 数据网格添加一行吗?

c++ - 将 double[,] 转换为 Variant*

c# - 当另一个控件与它重叠时隐藏控件

c# - 如何确定 WPF 日历控件中鼠标悬停在哪个日期?

c# - 使用 WPF/C# 中的绑定(bind)获取更改的数据

wpf - 在XAML中命名没有默认构造函数的用户控件

c# - 为什么我的按钮在 MouseOver 上没有改变颜色?

WPF DataGrid 禁用一行但允许一个单元格

WPF DataGrid ItemsSource 绑定(bind)问题