2017-02-16 44 views
0

我是新來的WPF和所有這些神奇的綁定和datatriggers的東西,所以我問你一些幫助。WPF多條件綁定過濾

我有一個簡單的WPF應用程序顯示在下面的圖片。 enter image description here

我想我的datagrid內容反映條件和日期過濾器。我已經想出瞭如何根據事件代碼和複選框(啓動,停止,錯誤)綁定數據網格行可視性。但我不知道如何實現日期過濾。我想要的是:當「按日期過濾」複選框被選中時,在我的數據網格中,只有那些行保持可見,其中有「日期服務器時間」字段(我想我需要從日期時間解析它)等於選定的日期組合框。 我可以使用xaml來實現嗎? enyone能幫我做到嗎? 這裏是我的DataGrid的XAML:

<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

只使用複選框事件背後更新代碼的的ObservableCollection。 – 0x4f3759df

回答

1

我能做到,只有使用XAML?

不,你不能因爲XAML是標記語言,沒有別的。

你shold做的是綁定的日期SelectedItemComboBox到您的視圖模型的DateTime財產與「過濾器」複選框中的IsChecked屬性綁定到您的視圖模型的bool財產和過濾LogEntries源採集時IsChecked源屬性設置,如:

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

我懷疑是有辦法只能做在XAML,因爲濾波需要你(通過創建謂詞爲例),指定如何篩選。
我建議從ItemsSource獲取一個ICollectionView(我假設它是一個ObservableCollection)並將其設置爲Filter屬性。
看看這個答案詳細信息:Filter a DataGrid in WPF