2009-12-17 8 views
9

Ich habe so etwas wie Orders Tabelle an eine DataGrid gebunden. Ich möchte die Bearbeitung in Zeilen deaktivieren, wo das Bestelldatum abgelaufen ist (Enddatum> aktuelles Datum): zeige sie grau und verbiete den Bearbeitungsmodus. HierWPF DataGrid: Deaktivieren der Bearbeitung in bestimmten Zeilen

ist, was ich habe:

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

Bestelldatum wird eine Vorlagenspalte wie folgt definiert:

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

Gibt es eine Möglichkeit Editiermodus in Zeilen zu deaktivieren, in dem Bestelldatum abgelaufen ist ?

+1

In Verbindung stehend: http://stackoverflow.com/questions/2030143/wpf-datagrid-with-some-read-only-rows – surfen

Antwort

10

Es scheint also, dass alles funktioniert, aber Sie brauchen eine Möglichkeit zu überprüfen (order_date> current_date) in einem Trigger? Wenn das der Fall ist, könnten Sie einen ValueConverter wie vielleicht DateExpiredConverter schreiben und dort die Bedingung prüfen und einen booleschen Wert zurückgeben.

Der Konverter-Klasse könnte wie folgt aussehen:

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

Dann in Ihrem Trigger Sie so etwas tun:

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

Ich habe diesen Code nicht getestet, aber es sollte ziemlich nah dran sein zu was du brauchst.

+1

Thanks! Du hast meinen Tag gerettet. return Auftragsdatum> DateTime.Now;) – jonny

Verwandte Themen