【问题标题】:WPF multiple filters not working on DataGridWPF多个过滤器不适用于DataGrid
【发布时间】:2020-05-18 21:15:38
【问题描述】:

我有一个绑定到 LogData 类型的 CollectionView LogDataView 的 DataGrid。对于dataGrid 中的每个数据,我有两个过滤器,一个用于LogType,另一个用于LogDirection。我的问题是如果我应用方向过滤器(ex-RX),那么在 LogType 过滤器中也会为 TX 消息返回 true。所以现在我看到了 RX 和 TX 消息(理想情况下我应该只看到 RX)。 我使用按钮单击来应用过滤器。

我已经通过WPF multiple filters CollectionViewSource, first filter added works correctly, second filter added does not 但没有帮助。 请提出建议。

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>

视图模型:

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();
            }
        }

【问题讨论】:

    标签: c# wpf filter collectionview


    【解决方案1】:

    过滤器按添加顺序应用。您需要同步两个过滤器。也许使用变量。

                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;
                    }
                }
    
    

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多