2017-02-16 1 views
0

Ich bin neu bei WPF und all diesen magischen Binde- und Datentrigger-Sachen, also bitte ich dich um ein wenig Hilfe.WPF multiple-condition binding filterung

Ich habe eine einfache wpf app auf dem Bild unten gezeigt. enter image description here

Ich möchte, dass mein Datagrid-Inhalt Bedingungen und Datumsfilter widerspiegelt. Ich habe bereits herausgefunden, wie man die Sichtbarkeit von Datagrid-Zeilen abhängig von Ereigniscodes und Checkboxen (Start, Stop, Fehler) bindet. Aber ich kann nicht herausfinden, wie Datumsfilterung zu implementieren ist. Alles was ich will ist: Wenn das Kontrollkästchen "Nach Datum filtern" aktiviert ist, bleiben in meinem Datagrid nur die Zeilen sichtbar, deren Datum im Feld "Serverzeit" liegt (ich denke, ich muss es irgendwie von datetime parsen) . Kann ich das nur mit Xaml erreichen? Kann Enyone mir helfen, das zu tun? Hier ist XAML für meinen Datagrid:

<DataGrid 
     Grid.Row="1" 
     Margin="5" 
     AutoGenerateColumns="False" 
     IsReadOnly="True" 
     ItemsSource="{Binding LogEntries}" 
     Style="{DynamicResource Helvetica}"> 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding event_code}" Value="1"> 
         <Setter Property="Background" Value="LightGreen" /> 
         <Setter Property="Visibility" Value="{Binding IsChecked, ElementName=StartShowChecked, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding event_code}" Value="2"> 
         <Setter Property="Background" Value="LightGray" /> 
         <Setter Property="Visibility" Value="{Binding IsChecked, ElementName=StopShowChecked, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding event_code}" Value="3"> 
         <Setter Property="Background" Value="#FFEA816F" /> 
         <Setter Property="Visibility" Value="{Binding IsChecked, ElementName=ErrorShowChecked, Converter={StaticResource BooleanToVisibilityConverter}}" /> 
        </DataTrigger> 

       </Style.Triggers> 
      </Style> 
     </DataGrid.RowStyle> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding server_datetime, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" Header="Server time" /> 
      <DataGridTextColumn Binding="{Binding user_datetime, StringFormat=\{0:dd.MM.yy HH:mm:ss\}}" Header="Client time" /> 
      <DataGridTextColumn 
       Width="*" 
       Binding="{Binding log_entry}" 
       Header="Entry" /> 

     </DataGrid.Columns> 
+0

benutzen Sie einfach das Kontrollkästchen Ereignis und aktualisieren Sie Ihre ObservableCollection in Code-behind. – 0x4f3759df

Antwort

1

kann ich erreichen, dass XAML nur mit?

Nein, Sie können nicht, weil XAML ein Markup ist Sprache und nichts anderes.

Was Sie tun shold ist die SelectedItem des Datums ComboBox zu einer DateTime Eigenschaft Ihrer Ansicht Modell zu binden und binden, um die IsChecked Eigenschaft des „Filters durch“ CheckBox auf eine bool Eigenschaft Ihrer Ansicht Modell und filtern die LogEntries Quelle Sammlung, wenn die IsChecked Quelle Eigenschaft festgelegt ist, zum Beispiel:

public class ViewModel : INotifyPropertyChanged 
{ 

    private bool _isChecked; 
    public bool IsChecked 
    { 
     get { return _isChecked; } 
     set 
     { 
      _isChecked = value; 
      OnPropertyChanged(); 
      //filter collection: 
      LogEntries = allLogEntries.Where(x => x.ServerTime == SelectedDate).ToList(); 
     } 
    } 

    private List<LogEntry> _logEntries; 
    public List<LogEntry LogEntries 
    { 
     get { return _logEntries; } 
     set 
     { 
      _logEntries = value; 
      OnPropertyChanged(); 
     } 
    } 

    //... 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
0

Ich bezweifle, gibt es eine Möglichkeit, es in XAML nur zu tun, da Filterung Sie erfordert angeben, wie zum Filtern (zB durch ein Prädikat zu schaffen).
Was ich empfehle ist, eine ICollectionView von Ihrer ItemsSource (die ich vermute, ist eine ObservableCollection) und legen Sie die Filter-Eigenschaft.
Überprüfen Sie diese Antwort aus, um weitere Informationen: Filter a DataGrid in WPF