2009-12-17 10 views
9

DataGrid에 바인딩 된 orders 테이블과 같은 것이 있습니다. 주문 날짜가 만료 된 행에 대한 편집을 비활성화하고 싶습니다 (마감일> 현재 날짜) : 회색으로 표시하고 수정 모드로 들어 가지 않습니다.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> 

가 주문 날짜가 만료 된 행의 편집 모드를 해제하는 방법이 있나요 여기

내가 가진 무엇 ?

+1

관련 항목 : http://stackoverflow.com/questions/2030143/wpf-datagrid-with-some-read-only-rows – surfen

답변

10

그래서 모든 것이 작동하지만 트리거 (order_date> current_date)를 확인하는 방법이 필요합니까? 이 경우 아마도 DateExpiredConverter와 같은 ValueConverter를 작성하고 거기에서 조건을 확인하고 부울을 반환 할 수 있습니다.

컨버터 클래스는 다음과 같이 보일 수 있습니다 :이 코드를 테스트하지 않았습니다

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

하지만 꽤 가까이 있어야 :

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

그런 다음 트리거에서이 같은 일을 할 너에게 필요한 것.

+1

감사! 너는 내 하루를 구했다. return order_date> DateTime.Now;) – jonny

관련 문제