2017-02-16 49 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