2017-11-24 15 views
1

フィルタボックスを取得しようとするときに問題が発生しました。これは、スタイリングによってデータグリッド列のヘッダーに追加されます。私は列を並べ替えていないときは問題はありませんが、問題はありませんが、並べ替えが行われた時点では何も表示されず、1つの文字だけをフィルタリングできますTextChangedイベントを削除してトリガーする文字はありません)。WPF DataGridでの並べ替えとフィルタ処理の問題

奇妙なことは、TextBoxが、列がソートされたときにDataGridColumnHeaderインスタンスから開始してビジュアルツリー内に見つからないことです。私がそれを見つけることができれば、サイクルの終わりにテキストをリセットすることができ、問題はおそらく解決されるだろう。

視覚それは次のようになり、私はすべての3例では「P」を入力した: enter image description here

をこの背後に関連したスタイリングは以下の通りです:の定義における

<Page.Resources> 
    <Style x:Key="Filter" TargetType="TextBox"> 
     <EventSetter Event="TextChanged" Handler="Filter_TextBox_TextChanged"/> 
    </Style> 
    <Style TargetType="{x:Type DataGrid}"> 
     <!-- Some visual styling like margins and colors on the grid --> 
     <Style.Resources> 
      <Style TargetType="{x:Type DataGridColumnHeader}"> 
       <!-- Some visual styling like margins and colors on the header --> 
       <Setter Property="ContentTemplate"> 
        <Setter.Value> 
         <DataTemplate> 
          <StackPanel> 
           <Grid> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto"/> 
             <RowDefinition Height="Auto"/> 
            </Grid.RowDefinitions> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="*"/> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="Auto"/> 
            </Grid.ColumnDefinitions> 
            <TextBlock Grid.Column="0" Grid.Row="0" Margin="10,0,10,0" TextWrapping="WrapWithOverflow" Text="{Binding}"/> 
            <fa:FontAwesome Grid.Column="1" Grid.Row="0" Icon="LongArrowUp" Foreground="#dbdbdb" HorizontalAlignment="Right" VerticalAlignment="Bottom"/> 
            <fa:FontAwesome Grid.Column="2" Grid.Row="0" Margin="0,0,10,0" Icon="LongArrowDown" Foreground="#dbdbdb" HorizontalAlignment="Right" VerticalAlignment="Bottom"/> 
            <StackPanel Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="1" Margin="0,10,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Background="#dbdbdb"> 
             <TextBox Style="{StaticResource Filter}" /> 
            </StackPanel> 
           </Grid> 
          </StackPanel> 
         </DataTemplate> 
        </Setter.Value> 
       </Setter> 
       <Style.Triggers> 
        <Trigger Property="SortDirection" Value="Ascending"> 
         <Setter Property="Background" Value="#F0F0F0"/> 
         <Setter Property="ContentTemplate"> 
          <Setter.Value> 
           <DataTemplate> 
            <StackPanel> 
             <Grid> 
              <Grid.RowDefinitions> 
               <RowDefinition Height="Auto"/> 
               <RowDefinition Height="Auto"/> 
              </Grid.RowDefinitions> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="*"/> 
               <ColumnDefinition Width="Auto"/> 
              </Grid.ColumnDefinitions> 
              <TextBlock Grid.Column="0" Grid.Row="0" Margin="5,0,10,0" TextWrapping="WrapWithOverflow" Text="{Binding}"/> 
              <fa:FontAwesome Grid.Column="1" Grid.Row="0" Margin="0,0,10,0" Icon="SortAmountAsc" Foreground="#919191" HorizontalAlignment="Right" VerticalAlignment="Bottom"/> 
              <StackPanel Grid.Column="0" Grid.ColumnSpan="3" Margin="0,10,0,0" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#dbdbdb"> 
               <TextBox Style="{StaticResource Filter}" /> 
              </StackPanel> 
             </Grid> 
            </StackPanel> 
           </DataTemplate> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
        <Trigger Property="SortDirection" Value="Descending"> 
         <Setter Property="Background" Value="#F0F0F0"/> 
         <Setter Property="ContentTemplate"> 
          <Setter.Value> 
           <DataTemplate> 
            <StackPanel> 
             <Grid> 
              <Grid.RowDefinitions> 
               <RowDefinition Height="Auto"/> 
               <RowDefinition Height="Auto"/> 
              </Grid.RowDefinitions> 
              <Grid.ColumnDefinitions> 
               <ColumnDefinition Width="*"/> 
               <ColumnDefinition Width="Auto"/> 
              </Grid.ColumnDefinitions> 
              <TextBlock Grid.Row="0" Grid.Column="0" Margin="5,0,10,0" TextWrapping="WrapWithOverflow" Text="{Binding}"/> 
              <fa:FontAwesome Grid.Row="0" Grid.Column="1" Margin="0,0,10,0" Icon="SortAmountDesc" Foreground="#919191" HorizontalAlignment="Right" VerticalAlignment="Bottom"/> 
              <StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Margin="0,10,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#dbdbdb"> 
               <TextBox Style="{StaticResource Filter}" /> 
              </StackPanel> 
             </Grid> 
            </StackPanel> 
           </DataTemplate> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 

特別な何もデータグリッド:

<DataGrid x:Name="History_DataGrid" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" HeadersVisibility="Column" GridLinesVisibility="None" ItemsSource="{Binding history}" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SelectionMode="Single" SelectionUnit="FullRow" CanUserAddRows="false" SelectionChanged="History_DataGrid_SelectionChanged" Sorting="History_DataGrid_Sorting"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="{x:Static resx:Resources.Product}" Binding="{Binding Path=Product}" Width="*" ElementStyle="{StaticResource Wrap}" /> 
      <DataGridTextColumn Header="{x:Static resx:Resources.Label}" Binding="{Binding Path=Label}" Width="*" ElementStyle="{StaticResource Wrap}" /> 
      <DataGridTextColumn Header="{x:Static resx:Resources.Color}" Binding="{Binding Path=Color}" Width="*" ElementStyle="{StaticResource Wrap}" /> 
      <DataGridTextColumn Header="{x:Static resx:Resources.Volume}" Binding="{Binding Path=Volume}" Width="Auto" ElementStyle="{StaticResource Wrap}" /> 
      <DataGridTextColumn Header="{x:Static resx:Resources.LastPrinted}" Binding="{Binding Path=LastPrinted, StringFormat=\{0:yyyy-MM-dd\}}" Width="Auto" ElementStyle="{StaticResource Wrap}" /> 
      <DataGridTextColumn Header="{x:Static resx:Resources.TimesPrinted}" Binding="{Binding Path=TimesPrinted}" Width="Auto" ElementStyle="{StaticResource Wrap}" /> 
     </DataGrid.Columns> 
    </DataGrid> 

可能な方法は、私はわかりませんけれども、それらをどのように達成するために、問題を回避するには:

  • 並べ替え後に を変更しないフィルタボックスを使用して2番目のヘッダー行を作成します。
  • Iがテキストボックスにアクセスできるようにする必要 も イベントサイクルの終了時にフィルタテキストボックスの値を設定し、私は、私はデータグリッドがリバウンドした後にトリガされるページング コントロールを準備機能を有しますそのインスタンス。 それはソートされていませんが、列がソートされているときにボックスを見つけることができません。

これを解決するにはどうすればよいか、それは本当に大きな問題であり、検索結果には何も役立たないものはありません。

EDIT:それがどのように動作するかを明確化

とどのようにそれがいる限り、私はソートしないように機能するためのいくつかのシナリオ:

  1. 私はテキストボックスに「A」を入力します。

  2. データグリッドのソースは、テキスト "A"でフィルタリングされ、リバウンドします。

  3. テキストボックスには、フィルタとして「A」が表示されます。

  4. テキストボックスに「B」と入力します。

  5. データグリッドのソースは、テキスト「AB」でフィルタリングされ、リバウンドします。

  6. テキストボックスには、フィルタとして「AB」と表示されます。私が列をソート

    1. 、それがテキストボックスにすでにいたテキストを失う:列がソートされている場合

    、それは非常に動作が異なります。

  7. 私はテキストボックスに「A」と入力します。

  8. データグリッドのソースは、テキスト "A"でフィルタリングされ、リバウンドします。

  9. テキストボックスは空のままであり、フィルタとして「A」を表示しません。

  10. テキストボックスに「B」と入力します。

  11. データグリッドのソースは、 "AB"ではなく "B"でフィルタリングされ、リバウンドします。

  12. テキストボックスは空のままで、フィルタとして「A」、「B」または「AB」は表示されません。

この結果、フィルタを削除することは非常に困難であり、削除するテキストもTextChangedイベントをトリガすることもありません。

答えて

0

私は私の会社のWPF専門家と連絡を取り合い、実現可能な解決策を導きました。

編集したスタイルは、以下のようになります。

<Page.Resources> 
<Style x:Key="Filter" TargetType="TextBox"> 
    <EventSetter Event="TextChanged" Handler="Filter_TextBox_TextChanged"/> 
</Style> 
<Style TargetType="{x:Type DataGrid}"> 
    <!-- Some visual styling like margins and colors on the grid --> 
    <Style.Resources> 
     <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <!-- Some visual styling like margins and colors on the header --> 
      <Setter Property="ContentTemplate"> 
       <Setter.Value> 
        <DataTemplate> 
         <StackPanel> 
          <Grid> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="Auto"/> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="Auto"/> 
           </Grid.ColumnDefinitions> 
           <TextBlock Grid.Column="0" Grid.Row="0" Margin="10,0,10,0" TextWrapping="WrapWithOverflow" Text="{Binding}"/> 
            <fa:FontAwesome Grid.Column="1" Grid.Row="0" x:Name="SortIcon1" Icon="LongArrowUp" Foreground="#dbdbdb" HorizontalAlignment="Right" VerticalAlignment="Bottom"/> 
            <fa:FontAwesome Grid.Column="2" Grid.Row="0" x:Name="SortIcon2" Margin="0,0,10,0" Icon="LongArrowDown" Foreground="#dbdbdb" HorizontalAlignment="Right" VerticalAlignment="Bottom"/> 
           <StackPanel Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="1" Margin="0,10,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Background="#dbdbdb"> 
            <TextBox Style="{StaticResource Filter}" /> 
           </StackPanel> 
          </Grid> 
         </StackPanel> 
         <DataTemplate.Triggers> 
          <DataTrigger Binding="{Binding SortDirection, RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}}" Value="Ascending"> 
           <Setter TargetName="SortIcon1" Property="Icon" Value="SortAmountAsc" /> 
           <Setter TargetName="SortIcon2" Property="Visibility" Value="Hidden" /> 
          </DataTrigger> 
          <DataTrigger Binding="{Binding SortDirection, RelativeSource={RelativeSource AncestorType=DataGridColumnHeader}}" Value="Descending"> 
           <Setter TargetName="SortIcon1" Property="Icon" Value="SortAmountDesc" /> 
           <Setter TargetName="SortIcon2" Property="Visibility" Value="Hidden" /> 
          </DataTrigger> 
         </DataTemplate.Triggers> 
        </DataTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <Trigger Property="SortDirection" Value="Ascending"> 
        <Setter Property="Background" Value="#F0F0F0"/> 
       </Trigger> 
       <Trigger Property="SortDirection" Value="Descending"> 
        <Setter Property="Background" Value="#F0F0F0"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 

を基本的に私のメインのミスがソート状態ごとのDataTemplateを持っていることでした。彼らは、ヘッダーのイベントにバインドされたDatatemplateにトリガーを追加できると指摘しました。私のソートアイコンに名前を追加すると、新しいトリガーセクションのTargetName属性で名前を変更することができました。

テキストボックスのインスタンスが1つしかないため、問題は解決されています。

関連する問題