Как запретить редактирование записи при определённых условиях в привязке?

Рейтинг: 0Ответов: 1Опубликовано: 08.10.2014

Здравствуйте. У меня есть DataGrid следующего вида:

<DataGrid ItemsSource="{Binding Plavkas}"  Grid.Row="1" CanUserAddRows="False" 
                  CanUserDeleteRows="False" SelectionMode="Single" SelectedItem="{Binding CurrentPlavka}"
                  AutoGenerateColumns="False">
<DataGrid.Columns>
    <DataGridTextColumn  Header="Плавка"  Binding="{Binding plavka1}" />    
    <DataGridComboBoxColumn x:Name="catMetalColumn"  Header="Категория" DisplayMemberPath="category" SelectedItemBinding="{Binding catMetal1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    <DataGridTextColumn x:Name="smenaColumn" Binding="{Binding smena}" Header="Смена"/>
    <DataGridTemplateColumn x:Name="dataPrig" Header="Дата приготовление.">
    <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <DatePicker Height="19" FontSize="11" Padding="5,0,0,0" Margin="5,0,5,0" 
                                 SelectedDate="{Binding dataPrig, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                                  Loaded="ComboBox_Loaded"
                                  SelectedDateChanged="DatePicker_SelectedDateChanged"
                                   />                                       
                    </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

Как мне запретить редактировать записи, если в ячейке dataPrig вчерашняя дата (то есть разница между dataPrig и сегодняшней датой - 1 день)?

Ответы

▲ 3Принят

Я обычно для подобного использую стили.

Сначала нам нужен конвертер, который будет говорить, прошел день или нет:

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (DateTime.Now - datePrig).TotalDays >= 1 ? false : true;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Прописываем наш конвертер в ресурсы, например, окна:

<Window.Resources>
    <local:MyConverter x:Key="myConverter"/>
</Window.Resources>

Теперь описываем стиль:

<DataGrid.Resources>
    <Style TargetType="DataGridRow">
        <Setter Property="IsEnabled" Value="{Binding Path=datePrig, Converter={StaticResource myConverter}}"/>
    </Style>
</DataGrid.Resources>

Теперь, если прошел день и более, свойство DataGridRow.IsEnabled получит значение false, и строка получится нередактируемой.