У меня есть 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();
}
}