Найти элемент WPF внутри DataTemplate в коде - программирование
Подтвердить что ты не робот

Найти элемент WPF внутри DataTemplate в коде

У меня есть шаблон данных

<Window.Resources>
         <DataTemplate x:Key="BarChartItemsTemplate">
         <Border Width="385" Height="50">
            <Grid>
               <Rectangle Name="rectangleBarChart" Fill="MediumOrchid" StrokeThickness="2" Height="40" Width="{Binding}" HorizontalAlignment="Right" VerticalAlignment="Bottom">
                  <Rectangle.LayoutTransform>
                     <ScaleTransform ScaleX="4"/>
                  </Rectangle.LayoutTransform>
               </Rectangle>
               <TextBlock Margin="14" FontWeight="Bold" HorizontalAlignment="Right" VerticalAlignment="Center" Text="{Binding}">
                  <TextBlock.LayoutTransform>
                     <TransformGroup>
                        <RotateTransform Angle="90"/>
                        <ScaleTransform ScaleX="-1" ScaleY="1"/>
                     </TransformGroup>
                  </TextBlock.LayoutTransform>
               </TextBlock>
            </Grid>
         </Border>
      </DataTemplate>
  </Window.Resources>

У меня есть кнопка в форме. Мне нужно изменить масштаб (scaleTransform) прямоугольника из dataTemplate. Как я могу получить доступ к элементу 'rectangleBarChart' в событии Button_Click указанной кнопки?

4b9b3361

Ответ 1

Я часто использую эту функцию в своих программах WPF для поиска дочерних элементов:

public IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
   if (depObj != null)
   {
       for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
       {
           DependencyObject child = VisualTreeHelper.GetChild(depObj, i);

           if (child != null && child is T)
               yield return (T)child;

           foreach (T childOfChild in FindVisualChildren<T>(child))
               yield return childOfChild;
       }
   }
}

Использование:

foreach (var rectangle in FindVisualChildren<Rectangle>(this))
{
  if (rectangle.Name == "rectangleBarChart")
  {
    /*   Your code here  */
  }
}

Ответ 2

Не делай этого. Если вам нужно что-то изменить в DataTemplate, тогда свяжите соответствующие свойства и измените базовые данные. Также я бы рекомендовал привязать Button.Command к ICommand к вашей модели данных/представления (см. MVVM) вместо использования событий, тогда вы уже находитесь в правильном контексте, и в представлении ничего не нужно делать.