Столбец привязки видимости WPF в сетке данных
У меня есть DataGrid, где я пытаюсь контролировать видимость каждого столбца. Все работает нормально, когда я связываю источник столбца с реальной моделью представления, но я прочитал, что столбец должен быть привязан к элементу Framework, который я не совсем понимаю (потому что он не работает).
Я связал каждый столбец по-разному. Один прямо к ViewModel, который работает. Другой столбец я привязал к FrameworkElement, который не работает. Я скопировал этот пример из гораздо большего блока кода, но я думаю, что все понял.
Может кто-нибудь, пожалуйста, покажите мне, как это должно быть сделано. Любое объяснение, которое поможет мне понять, также будет оценено.
<Page x:Class="gobo2018.View.TestPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:gobo2018.View"
xmlns:ViewModel="clr-namespace:gobo2018.ViewModel"
Title="TestPage">
<Page.Resources>
<ViewModel:ActiveJobViewModel x:Key="ActiveJobViewModel"/>
<Style TargetType="{x:Type TextBlock}" x:Key="WrapText">
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
</Page.Resources>
<Grid Grid.Row="9" HorizontalAlignment="Stretch" DataContext="{Binding Mode=OneWay, Source={StaticResource ActiveJobViewModel}}" >
<Grid.Resources>
<FrameworkElement x:Key="ProxyElement" DataContext="{Binding}"/>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="0"/>
<RowDefinition MaxHeight="610"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Row="0" Orientation="Vertical" Style="{StaticResource GlobalStackPanelStyle}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Background="Black">
<CheckBox VerticalAlignment="Center" IsChecked="{Binding EditVisibility, UpdateSourceTrigger=PropertyChanged}" IsTabStop="False" Margin=" 3 0 0 0 "/>
<Label Content="Edit/Delete" Margin=" 0 0 13 0 " HorizontalAlignment="Right" VerticalAlignment="Center"/>
<CheckBox VerticalAlignment="Center" IsChecked="{Binding DateVisibility, UpdateSourceTrigger=PropertyChanged}" IsTabStop="False" Margin=" 3 0 0 0 "/>
<Label Content="Date" Margin=" 0 0 13 0 " HorizontalAlignment="Right" VerticalAlignment="Center"/>
</StackPanel>
</StackPanel>
<DataGrid Grid.Row="2" x:Name="EstimateGrid" AutoGenerateColumns="False" EnableRowVirtualization="True"
RowDetailsVisibilityMode="VisibleWhenSelected" MaxHeight="600" Width="Auto" HorizontalAlignment="Left"
SelectionUnit="FullRow"
SelectionMode="Single"
ItemsSource="{Binding EstimateSortView, UpdateSourceTrigger=PropertyChanged}"
CanUserAddRows="False"
IsReadOnly="True"
SelectedItem="{Binding EstimateSelectedItem}"
SelectedIndex="-1"
SelectedValue ="{Binding EstimateGridSelectedValue}">
<DataGrid.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Yellow"/>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Edit"
Visibility="{Binding EditVisibility, Converter={StaticResource booleanToVisibility}, UpdateSourceTrigger=PropertyChanged, Source={StaticResource ProxyElement}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Edit Row" Foreground="DarkRed" FontSize="10" VerticalAlignment="Center" Padding="3"
Command="{Binding Path=DataContext.ShowEstimatingUserControlCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
CommandParameter="Edit"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Delete"
Visibility="{Binding EditVisibility, Converter={StaticResource booleanToVisibility}, UpdateSourceTrigger=PropertyChanged, Source={StaticResource ActiveJobViewModel}}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Delete" Foreground="DarkRed" FontSize="10" VerticalAlignment="Center" Padding="3"
Command="{Binding Path=DataContext.EstimateWindowDeleteDatagridRowCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
CommandParameter="Delete"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Page>
1 ответ
Так как Visibility не был DependencyProperty, он не мог связывать. Вместо использования Visibility по умолчанию создайте новое Присоединенное свойство
public class VisibilityAttachedProperty
{
public static bool GetVisibility(DependencyObject obj)
{
return (bool)obj.GetValue(VisibilityProperty);
}
public static void SetVisibility(DependencyObject obj, bool value)
{
obj.SetValue(VisibilityProperty, value);
}
public static readonly DependencyProperty VisibilityProperty =
DependencyProperty.RegisterAttached("Visibility", typeof(bool), typeof(VisibilityAttachedProperty), new PropertyMetadata(true, OnVisibilityChanged));
private static void OnVisibilityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if ((bool)e.NewValue)
{
(d as DataGridColumn).Visibility = Visibility.Visible;
}
else
{
(d as DataGridColumn).Visibility = Visibility.Collapsed;
}
}
}
<DataGridTemplateColumn Header="Edit" local:VisibilityAttachedProperty.Visibility="{Binding EditVisibility}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="Edit Row" Foreground="DarkRed" FontSize="10" VerticalAlignment="Center" Padding="3"
Command="{Binding Path=DataContext.ShowEstimatingUserControlCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
CommandParameter="Edit"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>