Ich versuche, Spalten in einem Datagrid
(gebunden an einen DataTable
) mit DataTrigger
zu verstecken. Damit kann der Benutzer auswählen, welche Spalten angezeigt werden. Mein Problem ist, dass dies nur einmal funktioniert. Normalerweise würde ich sagen, dass ich die INotifyPropertyChanged
, aber meine ContextMenu
ist in XAML definiert, so dass ich nicht sicher bin, ob und wie das zu tun ist.WPF: DataTrigger gebunden an ein ContextMenu MenuItem funktioniert nur einmal
Hier meine XAML
<ContextMenu >
....
<MenuItem Header="Apply" x:Name="ButtonApply" />
</ContextMenu>
<DataGrid ItemsSource="{Binding Path=TabDataTable}" AutoGenerateColumns="True" IsReadOnly="True" SelectionUnit="CellOrRowHeader" Margin="-5,-4,-5,-4" AlternatingRowBackground="Gainsboro" x:Name="MainDataGrid">
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ButtonApply, Path=IsPressed}" Value="True">
<Setter Property="Visibility">
<Setter.Value>
<!--<Binding Path=" DataContext.IsTemplateColumnVisibile, Source={StaticResource ProxyElement}, Converter={StaticResource BooleanToVisibilityConverter}}" />-->
<MultiBinding Converter="{StaticResource BooleanToVisibilityConverter}">
<Binding Path="Column"
RelativeSource="{RelativeSource Self}"/>
<Binding Path="DataContext.visibility"
RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}"/>
</MultiBinding>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
</DataGrid>
Hier die Converter
: (Sry für die irreführende Bezeichnung)
public object Convert(object[] value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value[0] == null)
{
return null;
}
if ((((ObservableCollection<bool>)value[1]).ToArray())[((System.Windows.Controls.DataGridTextColumn)value[0]).DisplayIndex])
{
//Column Visibility
((System.Windows.Controls.DataGridTextColumn)value[0]).Visibility = Visibility.Visible;
//Header Visibility
return Visibility.Visible;
}
((System.Windows.Controls.DataGridTextColumn)value[0]).Visibility = Visibility.Collapsed;
return Visibility.Collapsed;
}
Wenn es einen besseren Weg, dies zu tun ist, können Sie mich in den Punkt richtige Richtung.
Eine wilde Vermutung im Dunkeln: MultiBinding> –
lokusking
@lokusking konnte dies nicht zum Laufen bringen. – nick9999