C# 如何为DataGrid WPF创建复杂过滤器

C# 如何为DataGrid WPF创建复杂过滤器,c#,wpf,datagrid,C#,Wpf,Datagrid,我想为4个字段创建Filler。但是我得到的代码太多了。 当只选择一个字段或同时选择几个(2、3或4)字段时,我需要筛选。如何为它创造逻辑 我丑陋的代码: void ViewSource_Filter(object sender, FilterEventArgs e) { if (e.Item is Event evnt) { bool selectedModel = filterEventsControl.ComboBoxModels.SelectedIndex != 0 &

我想为4个字段创建Filler。但是我得到的代码太多了。 当只选择一个字段或同时选择几个(2、3或4)字段时,我需要筛选。如何为它创造逻辑

我丑陋的代码:

void ViewSource_Filter(object sender, FilterEventArgs e)
{
if (e.Item is Event evnt)
{

    bool selectedModel = filterEventsControl.ComboBoxModels.SelectedIndex != 0 && filterEventsControl.ComboBoxModels.SelectedItem != null;
    bool selectedIp = filterEventsControl.ComboBoxIPs.SelectedIndex != 0 && filterEventsControl.ComboBoxIPs.SelectedItem != null;
    bool selectedParameter = filterEventsControl.ComboBoxParameters.SelectedIndex != 0 && filterEventsControl.ComboBoxParameters.SelectedItem != null;
    bool selectedStatus = filterEventsControl.ComboBoxStatus.SelectedIndex != 0 && filterEventsControl.ComboBoxStatus.SelectedItem != null;

    if (selectedModel && !selectedIp && !selectedParameter && !selectedStatus)
    {
        var model = filterEventsControl.ComboBoxModels.SelectedItem.ToString();
         if (evnt.DeviceName == model)
         {
             e.Accepted = true;
         }
         else
         {
             e.Accepted = false;
         }
     }
     else if (selectedModel && selectedIp && !selectedParameter && !selectedStatus)
     {
         var model = filterEventsControl.ComboBoxModels.SelectedItem.ToString();
         var ip = filterEventsControl.ComboBoxIPs.SelectedItem.ToString();

         if (evnt.DeviceName == model && evnt.Ip == ip)
         {
             e.Accepted = true;
         }
         else
         {
             e.Accepted = false;
         }
     } 

    ...

     else
     {
        e.Accepted = true;
     }
}
}

它可以是这样的:

bool FilterByName(Event evnt)
{
  var model = filterEventsControl.ComboBoxModels.SelectedItem?.ToString();
  return evnt.DeviceName == model;
}

bool FilterByIp(Event evnt)
{
  var ip = filterEventsControl.ComboBoxIPs.SelectedItem?.ToString();
  return evnt.Ip == ip;
}

void ViewSource_Filter(object sender, FilterEventArgs e)
{
...
  bool res = true;
  if (selectedModel)
    res = res && FilterByName();
  if (selectedIp)
    res = res && FilterByIp();
...
}