2017-02-16 4 views
0

Я новичок в WPF и всех этих магических материалах привязки и datatriggers, поэтому я прошу вас немного помочь.WPF многосвязная фильтрация привязки

У меня есть простое приложение wpf, показанное на рисунке ниже. enter image description here

Я хочу, чтобы содержимое моего документа отображало условия и фильтр даты. Я уже выяснил, как привязывать видимость строк datagrid в зависимости от кодов событий и флажков (запуск, остановка, ошибка). Но я не могу понять, как реализовать фильтрацию даты. Все, что я хочу, это: когда отмечен флажок «Фильтровать по дате», в моем datagrid только те строки остаются видимыми, у которых есть дата в поле «время сервера» (я думаю, мне нужно как-то его анализировать с даты и времени), равную выбранной группе со списком даты , Могу ли я достичь этого, используя только xaml? Может ли enyone помочь мне сделать это? Вот XAML для моего 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

просто использовать событие флажка и обновить ObservableCollection в коде позади. – 0x4f3759df

ответ

1

Могу ли я достичь этого, используя только XAML?

Нет, вы не можете, потому что XAML является разметкой языка и ничего больше.

Что вы shold сделать, чтобы связать SelectedItem о дате ComboBox к DateTime собственности вашей модели представления и связать IsChecked свойства «фильтра по» CheckBox в 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, так как фильтрация требует, чтобы определить, как фильтр (например, путем создания предикат).
Я рекомендую получить ICollectionView из вашего ItemsSource (который, как я полагаю, является ObservableCollection), и установить его свойство Filter.
Проверьте этот ответ для более подробной информации: Filter a DataGrid in WPF