У меня есть шаблон управления datagrid. Он имеет UserControl с именем LoadingAnimation внутри него:Достигать контроля пользователя внутри шаблона управления datagrid
<ControlTemplate x:Key="TemplateDataGridPrintAndExport" TargetType="{x:Type DataGrid}">
<Grid Margin="5">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
<Label Content="{TemplateBinding ToolTip}" ></Label>
</Border>
<Border Margin="0,30,0,0" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1,0,1,1" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">
<ScrollViewer x:Name="DG_ScrollViewer" Focusable="False">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Button Command="ApplicationCommands.SelectAll" Focusable="False" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGrid}}}">
<Button.Visibility>
<Binding Path="HeadersVisibility" RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGrid}}">
<Binding.ConverterParameter>
<DataGridHeadersVisibility>All</DataGridHeadersVisibility>
</Binding.ConverterParameter>
</Binding>
</Button.Visibility>
</Button>
<Grid Grid.Column="1" Grid.Row="2" HorizontalAlignment="Right">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Style="{StaticResource StyleButtons}" Command="ApplicationCommands.NotACommand" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Source="../Styles/icons/page_excel.png" Grid.Column="0"/>
<TextBlock Text="Excel" Grid.Column="1" />
<UserControls:LoadingAnimation HorizontalAlignment="Center" x:Name="btnCustomWaitForExcel" Grid.Column="2" />
</Grid>
</Button>
<Button Grid.Column="1" Style="{StaticResource StyleButtons}" Command="ApplicationCommands.Print" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}}" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Source="../Styles/icons/printer.png" Grid.Column="0"/>
<TextBlock Text="Yazdır" Grid.Column="1" />
</Grid>
</Button>
</Grid>
<DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1">
<DataGridColumnHeadersPresenter.Visibility>
<Binding Path="HeadersVisibility" RelativeSource="{RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGrid}}">
<Binding.ConverterParameter>
<DataGridHeadersVisibility>Column</DataGridHeadersVisibility>
</Binding.ConverterParameter>
</Binding>
</DataGridColumnHeadersPresenter.Visibility>
</DataGridColumnHeadersPresenter>
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" CanHorizontallyScroll="False" Grid.ColumnSpan="2" CanVerticallyScroll="False" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Grid.Row="1"/>
<ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" Maximum="{TemplateBinding ScrollableHeight}" Orientation="Vertical" Grid.Row="1" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/>
<Grid Grid.Column="1" Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type DataGrid}}}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollBar x:Name="PART_HorizontalScrollBar" Grid.Column="1" Maximum="{TemplateBinding ScrollableWidth}" Orientation="Horizontal" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportWidth}"/>
</Grid>
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</ScrollViewer>
</Border>
</Grid>
</ControlTemplate>
связала ApplicationCommands.NotACommand на кнопку в нижней части сетки данных (названный btnCustomWaitForExcel).
И ApplicationCommands.NotACommand привязан к функции:
CommandBindings.Add(new CommandBinding(ApplicationCommands.NotACommand, ExportExecuted));
В методе ExportExecuted я попробовал четыре различных способа достичь btnCustomWaitForExcel внутри шаблона DataGrid:
private async void ExportExecuted(object sender, ExecutedRoutedEventArgs e)
{
try
{
//1. method
((LoadingAnimation)(LogicalTreeHelper.FindLogicalNode((DependencyObject)LogicalTreeHelper.GetChildren(((DataGrid)e.Parameter)), "btnCustomWaitForExcel"))).Visibility = Visibility.Hidden;
//2. method
((LoadingAnimation)(((DataGrid)e.Parameter).FindName("btnCustomWaitForExcel"))).Visibility = Visibility.Visible;
//3. method
bool isfind = false;
DependencyObject parent = ((DataGrid)e.Parameter);
while (!isfind)
{
IEnumerable children = LogicalTreeHelper.GetChildren(parent);
foreach (object child in children)
{
if (child is DependencyObject)
{
DependencyObject depChild = child as DependencyObject;
if (depChild.GetValue(FrameworkElement.NameProperty).ToString() == "btnCustomWaitForExcel")
{
isfind = true;
depChild.SetValue(FrameworkElement.VisibilityProperty, Visibility.Hidden);
}
parent = child as DependencyObject;
}
}
}
//4. method
((LoadingAnimation)((DataGrid)e.Parameter).Template.FindName("btnCustomWaitForExcel", dgrdYonetimRolYetkiRol)).Visibility = Visibility.Hidden;
//Excell esportation
var task = Task.Factory.StartNew(() => ExportExecuted_async(sender, e));
await task;
}
catch (Exception ex)
{
globalTool.insertError(ex, globalUser.ID, true);
}
}
I Could не изменяйте видимость пользовательского элемента управления. Любые идеи по изменению видимости пользовательского элемента управления внутри шаблона управления datagrid?
Да. Это работает. – osmanraifgunes