WPF datagrid:禁用某些行中的编辑

Posted

技术标签:

【中文标题】WPF datagrid:禁用某些行中的编辑【英文标题】:WPF datagrid: disable editing in certain rows 【发布时间】:2010-12-27 15:02:56 【问题描述】:

我有类似订单表绑定到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>

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

【问题讨论】:

相关:***.com/questions/2030143/… 【参考方案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>

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

【讨论】:

谢谢!你拯救了我的一天。返回 order_date > DateTime.Now ;)

以上是关于WPF datagrid:禁用某些行中的编辑的主要内容,如果未能解决你的问题,请参考以下文章

可以在 WPF 数据网格中禁用 F2 键吗?

WPF Datagrid 样式选定的行

wpf datagrid中如何获取选中行中模板如textbox,combobox的内容

放置在scrollviewer中时,WPF Datagrid虚拟化被禁用

在编辑时修改 WPF DataGrid 中的用户控件

wpf:DataGrid 禁用选定的行样式 - 或行选择