2016-02-11 1 views
1

У меня есть фильтр Стиль значка, реализованный для Target Type = DataGridColumnHeader, и я привязал стиль в DataGrid.Как обновить свойство bool на основе видимости кнопок в DataGridColumnHeader Style

Мое требование для обновления ViewModel bool PropertyHasFilterIcon к true если один из button в DataGridColumnHeader получает visibility visible иначе false

Мой XAML Стиль

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

Мой XAML DataGrid является

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

Имущество, которое мне нужно обновить это

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

Если какой-либо из Баттона Column Header получает Visibility Visible, то мне нужно изменить значение свойства HasFilterIcon в true иначе false. Пожалуйста, помогите мне.

Примечание: Стиль имеет N количество кнопок, из N, я должен проверить, есть ли одна из кнопки видно ...

ответ

0

использования BooleanToVisibilityConverter присутствует в System.Window.Control пространства имен. Просто укажите его ниже и используйте в привязке (в ресурсах страницы/окна).

<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 

Связывание, как показано ниже: (Режим OneWayToSource для отражения обратно в собственность)

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

UPDATE

Как нет чистого способа в XAML/WPF для сделайте это (только чистый способ состоит в том, чтобы создать отдельные свойства , чтобы разделить видимость кнопок)

дать ему попробовать

1.Create ваше имущество, как это:

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. Пример 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. Преобразователь:

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

Причина В чем мы, а не ПРОГРАММЫ. :)

+0

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

+0

Стиль имеет N количество кнопок, из N я должен проверить, есть ли одна из кнопок Visible ... –

+0

@ B.Balamanigandan режим использования OneWayToSource. то, если какая-либо кнопка получит visibilty = visible, ваш HasFilterIcon установит значение true. –

Смежные вопросы