【发布时间】: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