0

チェックボックスを使用して、データグリッドにバインドされた特定の監視可能なコレクションアイテムを除外するフィルター機能をアプリケーションに配置しています。エラーはまったく発生しません。フィルターが意図したとおりに機能しません。そのための xaml コードは次のとおりです。

<Window.Resources>
    <CollectionViewSource x:Key="jobItemViewSource" d:DesignSource="{d:DesignInstance my:JobItem, CreateList=True}"/>
</Window.Resources>

<!--
 Irrelevant Content
  -->

<CheckBox Content="Show Active Jobs" Name="actJobsCheckBox" Grid.Column="1" Grid.ColumnSpan="2"  Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="AddAFiltering" Unchecked="RemoveAFiltering" />
                <CheckBox Content="Show Completed Jobs" Name="compJobsCheckBox" Grid.Column="3" Grid.ColumnSpan="3"  Grid.Row="3" HorizontalAlignment="Center" VerticalAlignment="Center" Checked="AddCFiltering" Unchecked="RemoveCFiltering"/>

                <DataGrid Grid.Row="4" Grid.ColumnSpan="6" LoadingRow="jobItemDataGrid_LoadingRow" ItemsSource="{Binding}" Name="jobItemDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" IsReadOnly="True" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" Grid.RowSpan="2">
                    <DataGrid.Columns>
                        <DataGridTextColumn x:Name="workOrderNoColumn" Binding="{Binding Path=WorkOrderNo}" Header="Work Order No." Width="75" />
                        <DataGridTextColumn x:Name="assigneeColumn" Binding="{Binding Path=PrimaryAssignee}" Header="Assignee" Width="80" />
                        <DataGridTextColumn x:Name="dateReceivedColumn" Binding="{Binding Path=DateReceived}" Header="Date Received" Width="90" />
                        <DataGridTextColumn x:Name="dueDateColumn" Binding="{Binding Path=DueDate}" Header="Due Date" Width="90" />
                        <DataGridTextColumn x:Name="statusColumn" Binding="{Binding Path=Status}" Header="Status" Width="70" />
                    </DataGrid.Columns>

                </DataGrid>

次に、コードビハインドのために私が書いたものを次に示します。

public AdminView(Employee currEmployee)
    {
        this.Title = "Administrator View - " + currEmployee.Name;
        InitializeComponent();
        jobItemDataGrid.DataContext = JobItemList;
        jobItemViewSource = (CollectionViewSource)(this.Resources["jobItemViewSource"]);

        LoadDummies();


    }

private void AddAFiltering(object sender, RoutedEventArgs args)
    {
        jobItemViewSource.Filter += new FilterEventHandler(ActiveJobs_Filter);
    }

    private void RemoveAFiltering(object sender, RoutedEventArgs args)
    {
        jobItemViewSource.Filter -= new FilterEventHandler(ActiveJobs_Filter);
    }

    private void AddCFiltering(object sender, RoutedEventArgs args)
    {
        jobItemViewSource.Filter += new FilterEventHandler(CompletedJobs_Filter);
    }

    private void RemoveCFiltering(object sender, RoutedEventArgs args)
    {
        jobItemViewSource.Filter -= new FilterEventHandler(CompletedJobs_Filter);
    }

    private void ActiveJobs_Filter(object sender, FilterEventArgs e)
    {
        JobItem currJob = e.Item as JobItem;
        if (currJob != null)
        {
            if (!currJob.Status.Equals("Completed"))
            {
                e.Accepted = true;
            }
            else
            {
                e.Accepted = false;
            }
        }
    }

    private void CompletedJobs_Filter(object sender, FilterEventArgs e)
    {
        JobItem currJob = e.Item as JobItem;
        if (currJob != null)
        {
            if (currJob.Status.Equals("Completed"))
            {
                e.Accepted = true;
            }
            else
            {
                e.Accepted = false;
            }
        }
    }
4

1 に答える 1

1

あなたのアプローチを使用してそれを修正する方法がわかりません。しかし、これが私がこのタスクを達成する方法です。メイン リストの代わりにバインドする FilteredJobItemList というプロパティを作成します。チェックボックスをプロパティ IsActiveChecked/IsCompletedChecked にバインドします。これらのセッターで、FilteredJobItemList の propertychanged イベントを発生させます。

public ObservableCollection<JobItem> FilteredJobItemList
{
   get
   {
      if ((IsActiveChecked) && (!IsCompletedChecked))
      {
          return JobItemList.Where(x => x.status != "Completed");
      }
      else if ((!IsActiveChecked) && (IsCompletedChecked))
      {
          return JobItemList.Where(x => x.status == "Completed");
      }
      else
      {
          return JobItemList;
      }
   }
}

public bool IsActiveChecked
{
   get
   {
      return _isActiveChecked;
   }
   set
   {
      if (value != _isActiveChecked)
      {
          _isActiveChecked = value;
          OnPropertyChanged("IsActiveChecked");
          OnPropertyChanged("FilteredJobItemList");
      }
   }
} 

public bool IsCompletedChecked
{
   get
   {
      return _isCompletedChecked;
   }
   set
   {
      if (value != _isCompletedChecked)
      {
          _isCompletedChecked = value;
          OnPropertyChanged("IsCompletedChecked");
          OnPropertyChanged("FilteredJobItemList");
      }
   }
} 
于 2012-05-29T15:24:17.887 に答える