WPF datagrid:禁用某些行中的编辑 [英] WPF datagrid: disable editing in certain rows

查看:2517
本文介绍了WPF datagrid:禁用某些行中的编辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像订单表绑定到一个 DataGrid 的东西。
我想禁止在行上编辑,订单日期到期(截止日期>当前日期):显示为灰色,禁止进入编辑模式。



这是我有的:

 < Style TargetType ={x:Type WPFToolkit:DataGridRow}> 
< Style.Triggers>
< MultiTrigger>
< MultiTrigger.Conditions>
<! - ? order_date> current_date - >
<! - 一些其他条件 - 已经工作 - >
< /MultiTrigger.Conditions>
< Setter Property =IsEnabledValue =False/>
< Setter Property =ForegroundValue =LightGray/>
< / MultiTrigger>
< /Style.Triggers>
< / Style>

订单日期是一个定义如下的模板列:

 < WPFToolkit:DataGridTemplateColumn SortMemberPath =order_dateHeader =截止日期> 
< 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一样,并检查那里的条件并返回一个布尔值。



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

  public class DateExpiredConverter:IValueConverter 
{
public object Convert(object value,Type targetType,object parameter,CultureInfo文化)
{
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或操作未实现。);
}
}

然后在你的触发器中你做这样的事情: / p>

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

我没有测试过这个代码,但应该与你所需要的非常接近。 >

I have something like orders table bound to a DataGrid. I want to disable editing on rows, where order date is expired (deadline date > current date): show them greyed and ban entering into edit mode.

Here is what I have:

<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>

The order date is a template column defined as follows:

<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>

Is there a way to disable editing mode in rows where order date has expired?

解决方案

So it seems that everything works but you need a way to check (order_date > current_date) in a Trigger? If that is the case, you could write a ValueConverter like perhaps DateExpiredConverter and check the condition there and return a boolean.

The converter class might look something like this:

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.");
    }
}

Then in your trigger you do something like this:

<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>

I haven't tested this code but it should be pretty close to what you need.

这篇关于WPF datagrid:禁用某些行中的编辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆