简体   繁体   English

如何为DataGrid WPF创建复杂的筛选器

[英]How to create complex filter for DataGrid WPF

I want to create filrer for 4 fields. 我想为4个字段创建filrer。 But I get too many code. 但是我得到了太多的代码。 I need filter when just one field choosen or a few (2,3 or 4) fields at the same time. 当只选择一个字段或同时选择几个(2,3或4)字段时,我需要过滤器。 How to create logic for it? 如何为其创建逻辑?

My ugly code: 我的丑陋代码:

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

It can be something like this: 可能是这样的:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM