简体   繁体   中英

How to Update the bool Property based on Button Visibility in DataGridColumnHeader Style

I'm having filter Icon style implemented for the Target Type = DataGridColumnHeader and I attached the Style in DataGrid.

My Requirement is to Update the ViewModel bool Property HasFilterIcon to true if any one of the button within the DataGridColumnHeader gets the visibility visible otherwise false

My XAML Style is

<Style TargetType="{x:Type DataGridColumnHeader}" x:Key="DataGridElementStyle">
   <Setter Property="Template">
      <Setter.Value>
          <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
              <Button Name="autofilter" Command="{Binding Path=DataContext.FilterPopUpCommand, 
                                  RelativeSource={RelativeSource Mode=FindAncestor, 
                                                  AncestorType={x:Type Window}}}">
                  <Button.CommandParameter>
                      <MultiBinding Converter="{StaticResource MultiValueConverterKey}">
                          <Binding RelativeSource="{ RelativeSource Mode=FindAncestor, 
                                                     AncestorType={x:Type cust:DataGrid}}" />
                          <Binding Path="Column" 
                                   RelativeSource="{RelativeSource Mode=TemplatedParent}" />
                      </MultiBinding>
                  </Button.CommandParameter>
              </Button>
              <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsMouseOver" Value="True"></Condition>
                        </MultiTrigger.Conditions>
                        <Setter TargetName="autofilter" Property="Visibility" Value="Visible"/>
                    </MultiTrigger>
                </ControlTemplate.Triggers>
          </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

My XAML DataGrid is

<DataGrid Name="PassengerGrid" AutoGenerateColumns="False"  ColumnHeaderStyle="{StaticResource FilterDataGridColumnHeader}">
     <DataGridTextColumn Binding="{Binding CustomVisitTime}"  Header="Visit Time" CanUserSort="true" Width="90" ElementStyle="{StaticResource DataGridElementStyle}""/>
     <DataGridTextColumn Binding="{Binding PassengerName}"  Header="Passenger Name" CanUserSort="true" Width="90" ElementStyle="{StaticResource DataGridElementStyle}""/>
</DataGrid>

The Property which I need to Update is

private bool _hasFilterIcon = false;
public bool HasFilterIcon
{
    get { return _hasFilterIcon; }
    set
    {
        _hasFilterIcon = value;
        OnPropertyChanged();
    }
}

If any of the Column Header Button gets the Visibility Visible , then I need to change the value of the HasFilterIcon to true otherwise false . Kindly assist me.

Note: The Style has N number of buttons, out of NI have to check is there is any one of the button is Visible...

use BooleanToVisibilityConverter present in System.Window.Control namespace. Just declate it as below and use in in the binding(in page/window resources).

<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />

Binding is as below:(Mode OneWayToSource to reflect back to property)

Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}},Path=HasFilterIcon,Converter={StaticResource BooleanToVisibilityConverter},Mode=OneWayToSource}"

UPDATE

As there is no clean way in XAML/WPF to do this(only clean way is to create separate properties to separate button's visibility)

give it a try

1.Create your property like this:

private AllButtonVisibility visible = new AllButtonVisibility();

    public AllButtonVisibility Visible
    {
        get { return visible; }
        set 
        { 
            visible = value;
            RaiseChange("Visible");
        }
    }

    public class AllButtonVisibility
    {
        public bool AllButtonVisible { get; set; }
    }

2. Sample XAML:

 <Window.Resources>
    <local:MyMultivalueConverter x:Key="MyMultivalueConverter" />
</Window.Resources>

<ContentControl Width="0">
        <ContentControl.Content>
            <MultiBinding Converter="{StaticResource MyMultivalueConverter}">
            <Binding ElementName="dataGrid" />
            <Binding Path="Visible"  />
             <Binding ElementName="dataGrid" Path="ActualHeight" />
            </MultiBinding>
        </ContentControl.Content>
    </ContentControl>
</StackPanel>

3. Converter:

public class MyMultivalueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        List<DataGridColumnHeader> columnHeaders = GetVisualChildCollection<DataGridColumnHeader>(values[0] as DependencyObject);
        var AllButtonVisibility = values[1] as AllButtonVisibility;
        foreach (DataGridColumnHeader dataGridColumnHeader in columnHeaders)
        {               
            AllButtonVisibility.AllButtonVisible = dataGridColumnHeader.Visibility == Visibility.Visible;
            if (AllButtonVisibility.AllButtonVisible)
                return Binding.DoNothing;
        }
        return Binding.DoNothing;
    }

    public List<T> GetVisualChildCollection<T>(object parent) where T : Visual
    {
        List<T> visualCollection = new List<T>();
        GetVisualChildCollection(parent as DependencyObject, visualCollection);
        return visualCollection;
    }

    private void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual
    {
        int count = VisualTreeHelper.GetChildrenCount(parent);
        for (int i = 0; i < count; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(parent, i);
            if (child is T)
            {
                visualCollection.Add(child as T);
            }
            else if (child != null)
            {
                GetVisualChildCollection(child, visualCollection);
            }
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Cause In the what are we if not PROGRAMMERS. :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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