Как изменить цвет фильтра кнопок в datagridview при фильтрации

#wpf

#wpf

Вопрос:

Здравствуйте, я хочу изменить цвет пакета фильтров при фильтрации данных из данных GridView . Мой GridView дизайн такой:-

введите описание изображения здесь

Я хочу изменить цвет значка фильтра при нажатии кнопки применить фильтр и удалить цвет при нажатии кнопки удалить.

XML-код для GridViewColumnHeader :-

  <DataGrid  HorizontalAlignment="Left" Height="975" VerticalAlignment="Top" Width="1894"   AlternationCount="2"    AutoGenerateColumns="False"                
     ItemsSource="{Binding Products}" SelectedItem="{Binding IsSelected}" x:Name="dataGrid" Margin="10,75,-1144,0">

        <DataGrid.Resources>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="HorizontalContentAlignment" Value="Center" />
                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                <Setter Property="Height" Value="50" />
                <Setter Property="SeparatorBrush" Value="DarkRed" />
                <Setter Property="FontWeight" Value="Black" />

                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                            <Grid>
                                <Border x:Name="columnHeaderBorder"
                                BorderThickness="1"
                                Padding="3,0,3,0">
                                    <Border.BorderBrush>
                                        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                            <GradientStop Offset="0" Color="#ecebf2" />
                                            <GradientStop Offset="1" Color="#ecebf2" />
                                        </LinearGradientBrush>
                                    </Border.BorderBrush>
                                    <Border.Background>
                                        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                            <GradientStop Offset="0" Color="#575757" />
                                            <GradientStop Offset="1" Color="#575757" />
                                        </LinearGradientBrush>
                                    </Border.Background>
                                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                </Border>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>



                <Setter Property="ContentTemplate">


                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Visibility="Visible"  Background ="Transparent" >
                                <TextBlock  Text="{Binding}" Style="{StaticResource MaterialDesignCaptionTextBlock}" Foreground="White" Background="Transparent" HorizontalAlignment="Center" Margin="0,5"   >

                                </TextBlock>

                                <Button x:Name="btnfilter" Command="{ Binding ApplyFilterCommand}" Click="Btnfilter_Click" HorizontalContentAlignment="Right" 
                                    HorizontalAlignment="Right" BorderBrush="Transparent" Background="Transparent"  Margin="0,-2" >

                                    <materialDesign:PackIcon x:Name="FilterIcon" Kind="Filter" Foreground="White"  BorderThickness="0" BorderBrush="Transparent" HorizontalContentAlignment="Right" VerticalAlignment="Center">
                                        <materialDesign:PackIcon.Style>
                                            <Style TargetType="materialDesign:PackIcon" >
                                                <Style.Triggers>
                                                    <DataTrigger Binding="{Binding Boolfilteractivate}">
                                                        <Setter Property="Foreground" Value="Black">
                                                            
                                                        </Setter>
                                                        
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                            
                                        </materialDesign:PackIcon.Style>



                                    </materialDesign:PackIcon>

                                </Button>

                            </StackPanel>

                        </DataTemplate>
                    </Setter.Value>

                </Setter>
            </Style>
        </DataGrid.Resources>
  

Это общий шаблон для всех GridViewColumnHeader .

Пожалуйста, предложите, как изменить цвет filtericon для определенного столбца.

ВСПЛЫВАЮЩИЙ код для заголовка столбца:-

 <Popup  x:Name="popExcel" Width="300" Height="300" Placement="Bottom"  StaysOpen="False">
        <Border Background="White" BorderBrush="Gray" >
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <TextBox x:Name="tbfilter"  BorderBrush="Gray" Text=""  Foreground="Black" BorderThickness="3" Height="30" Grid.Row="0" Margin="10" TextChanged="Tbfilter_TextChanged" KeyDown="Tbfilter_KeyDown"></TextBox>
                <Separator Grid.Row="0" VerticalAlignment="Bottom" Margin="10,0" Height="3"/>
                <ListBox x:Name="lbfilter" BorderBrush="Black"  BorderThickness="0"  Grid.Row="1" Margin="10">
                    <ListBox.ItemContainerStyle>
                        <Style TargetType="ListBoxItem">
                            <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
                        </Style>
                    </ListBox.ItemContainerStyle>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <CheckBox Style="{StaticResource MaterialDesignAccentCheckBox}" Background="Gray" 
                                      IsChecked="{Binding Is_Check, UpdateSourceTrigger=PropertyChanged}"   Content="{Binding Title}"></CheckBox>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
                <Button x:Name="ApplyFilter" Style="{StaticResource MaterialDesignRaisedButton}"  Foreground="White" Command="{Binding ApplyFilterCommand }" Background="#575757" Click="ApplyFilter_Click" Grid.Row="2" Margin="10">Apply Filter</Button>
                <Button x:Name="ClearFilter" Style="{StaticResource MaterialDesignRaisedButton}" Foreground="White" Background="#575757" Click="ClearFilter_Click" Grid.Row="3" Margin="10">Remove Filter</Button>
            </Grid>
        </Border>
    </Popup>
  

Как мы можем вызвать packicon как дочерний элемент кнопки
, например:-

     string colName = "";
        Button btn = sender as Button;
        ObservableCollection<FilterObj> fltcurrent;
        popExcel.PlacementTarget = btn;
        StackPanel sp = btn.Parent as StackPanel;
        foreach(var ch in sp.Children)
        {
            if(ch is TextBlock tb)
            {
                colName = tb.Text;
               
                break;
            }         


        }


        foreach (var ch in sp.Children)
        {
            if (ch is Button bb)
            {               

             

            }
  

Потому что я не могу вызвать packicon по имени:-

Applyfiltermethod

Пожалуйста, помогите

Комментарии:

1. Может быть, вам нужно установить цвет переднего плана значка?

2. @ Efthymios Kalyviotis, это правильно, но как вызвать его в файле xaml.cs.

3. @SubrataMitra В виртуальной машине для этих данных фильтра вы можете добавить логическое значение, которое сохраняется, когда фильтр применяется или нет, а затем добавить DataTrigger привязку к этому bool.

4. @ Efthymios Kalyviotis, я пытаюсь с soulution, но никакого эффекта. Я публикую весь код xml и cs для лучшего понимания.

Ответ №1:

Я нахожу альтернативное решение:-

Вот код:-

  <Setter Property="ContentTemplate">


                    <Setter.Value>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal" Visibility="Visible"  Background ="Transparent" >
                                <TextBlock  Text="{Binding}" Style="{StaticResource MaterialDesignCaptionTextBlock}" Foreground="White" Background="Transparent" HorizontalAlignment="Center" Margin="0,5"   >

                                </TextBlock>

                                <Button x:Name="btnfilter"  Click="Btnfilter_Click" HorizontalContentAlignment="Right" 
                                    HorizontalAlignment="Right" BorderBrush="Transparent" Background="Transparent"  Margin="0,-2" >

                                    <materialDesign:PackIcon x:Name="FilterIcon" Kind="Filter" Foreground="White"  BorderThickness="0" BorderBrush="Transparent" HorizontalContentAlignment="Right" VerticalAlignment="Center">
                                  
                                    </materialDesign:PackIcon>

                                </Button>

                            </StackPanel>

                        </DataTemplate>
                    </Setter.Value>

                </Setter>
            </Style>
  

Также необходимо добавить некоторый код в файл CS.

     PackIcon wantedchild;
    IList<PackIcon> wantedchilds = new List<PackIcon>();

        Button button = sender as Button;
        object wantedNode = button.FindName("FilterIcon");

        if (wantedNode is PackIcon)
        {
            wantedchild = wantedNode as PackIcon;

            wantedchilds.Add(wantedchild);


        }
  

Добавить код кнопки: -`

 foreach(var child in wantedchilds)
  {
    child.Foreground = Brushes.Blue;

     }  `
 
  

Удалить код кнопки:-

       foreach (var child in wantedchilds)
        {
            child.Foreground = Brushes.White;

        }

        wantedchilds.Clear();