2014-10-01 4 views
2

У меня есть шаблон управления 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?

ответ

1

Ваш второй метод близок, но вместо использования метода FindName() на элементе управления вы должны использовать его на ControlTemplate. В этом случае у вас есть 2 вложенных ControlTemplate. Итак, сначала вы должны найти ScrollViewer внутри шаблона DataGrid. Далее вы найдете пользовательский элемент управления внутри шаблона в ScrollViewer:

LoadingAnimation loadingAnim = null; 
var viewer = ((DataGrid)e.Parameter).Template.FindName("DG_ScrollViewer") 
       as ScrollViewer; 
if(viewer != null){ 
    loadingAnim = viewer.Template.FindName("btnCustomWaitForExcel") 
       as LoadingAnimation; 
    if(loadingAnim != null) loadingAnim.Visibility = Visibility.Visible; 
} 

Добавлены if условия после безопасного ориентира, как правило, все они должны пройти и выполнить код внутри.

+1

Да. Это работает. – osmanraifgunes

0

Можете ли вы просто привязать тег кнопки к пользовательскому управлению btnCustomWaitForExcel? Затем в вашей команде выполните, приведите источник к кнопке, а затем его тег в элемент управления UploadAnimation и измените видимость.

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