Несколько фильтров WPF не работают на DataGrid - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть DataGrid, который привязан к CollectionView LogDataView типа LogData . Для каждого из данных в dataGrid у меня есть два фильтра: один для LogType и другой для LogDirection . Моя проблема: если я применяю фильтр направления (ex-RX), то в LogType Filter возвращает true и для сообщений TX. Теперь я вижу сообщения RX и TX (в идеале я должен видеть только RX). Я использую нажатие кнопки, чтобы применить фильтры.

Я прошел через WPF несколько фильтров CollectionViewSource, первый добавленный фильтр работает правильно, второй добавленный фильтр не , но не помогает. Пожалуйста, предложите.

XAML

<DataGrid Name="dgLogdata"  Margin="10" VerticalScrollBarVisibility="Visible" ItemsSource="{Binding LogDataView}"
                                      AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" >                          
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="H" Binding="{Binding HData}" FontFamily="Arial"/>
                                    <DataGridTextColumn Header="Raw"   Binding="{Binding Hex}" FontFamily="Arial"/>
                                </DataGrid.Columns>
</DataGrid>

ViewModel:

public class Item : INotifyPropertyChanged
        {           
            private string _content;
            private ObservableCollection<LogData> _logDataOC { get; set; }

            private byte _LogDir    = (byte)LogDirEnum.ELogDir_NONE; 
            private byte _LogLevel= (byte)LogTypeEnum.ELogType_NONE;
            public string Header { get; set; }


            public byte ELogDir
            {
                get { return _LogDir; }
                set { _LogDir = value; }
            }
            public byte ELogLevel
            {
                get { return _LogLevel; }
                set { _LogLevel = value; }
            }
            public Item()
            {
                LogDataOC = new ObservableCollection<LogData>();

                //add the filters
                var vLogDirFilter = new Predicate<object>(o => LogDirFilter(o as LogData));
                LogDataView.Filter += vLogDirFilter;

                var vLogLevelFilter = new Predicate<object>(o => LogLevelFiler(o as LogData));
                LogDataView.Filter += vLogLevelFilter;
            }

            public event PropertyChangedEventHandler PropertyChanged;
            private void OnPropertyChanged(string propertyName)
            {
                var handler = PropertyChanged;
                handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }

            public ObservableCollection<LogData> LogDataOC
            {
                get { return _logDataOC; }
                set
                {
                    _logDataOC = value;
                    OnPropertyChanged("LogDataOC");
                }
            }           

            public ICollectionView LogDataView => CollectionViewSource.GetDefaultView(LogDataOC);

            /**********************************Filter properties********************************/

            /*****LOG DIRECTION FILTER*****/
            private bool LogDirFilter(LogData m)
            {
                if (_LogDir == (byte)LogDirEnum.ELogDir_NONE)
                {
                    return true;
                }
                else if (_LogDir == m.LogDir)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

            /*******LOG LEVEL FILTER*******/
            bool LogLevelFiler(GUILogData m)
            {
                if (_LogLevel == (byte)LogLevelEnum.ELogLevel_NONE)
                {
                    return true;
                }
                else if (_LogLevel == m.LogLevel)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }


        }

Нажатие кнопки


        private void BtnRX_Click(object sender, RoutedEventArgs e)
        {
            Item item = null;
            //get the current tab
            if (ItemMap.ContainsKey(tabControl1.SelectedIndex))
            {
                item = ItemMap[tabControl1.SelectedIndex];
            }

            if (item != null)
            {
                //set the direction here to filter
                item.ELogDir = (byte)LogDirEnum.ELogDir_RX;
                item.LogDataView.Refresh();
            }
        }

1 Ответ

0 голосов
/ 04 февраля 2020

Фильтры применяются в порядке их добавления . Вам нужно синхронизировать c два фильтра. Возможно использование переменной.

            private bool bLogDirFilter = true;
            private bool bLogLevelFilter = true;

функция фильтра

private bool LogDirFilter(GUILogData m)
            {
                if (ELogDir == (byte)LogDirEnum.ELogDir_NONE)
                {
                    bLogDirFilter = true;
                    return true;
                }
                else if (ELogDir == m.LogDir)
                {
                    bLogDirFilter = true;
                    return true;
                }
                else
                {
                    bLogDirFilter = false;
                    return false;
                }
            }

            /*******LOG LEVEL FILTER*******/
            bool LogLevelFiler(GUILogData m)
            {
                if (bLogDirFilter && (ELogLevel == (byte)LogLevelEnum.ELogLevel_NONE))
                {
                    bLogLevelFilter = true;
                    return true;
                }
                else if (bLogDirFilter && (ELogLevel == m.LogLevel))
                {
                    bLogLevelFilter = true;
                    return true;
                }
                else
                {
                    bLogLevelFilter = false;
                    return false;
                }
            }

...