在代码隐藏中的 DataTemplate 中查找 WPF 元素

Posted

技术标签:

【中文标题】在代码隐藏中的 DataTemplate 中查找 WPF 元素【英文标题】:Find a WPF element inside DataTemplate in the code-behind 【发布时间】:2012-08-03 07:19:55 【问题描述】:

我有一个数据模板

<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>

我在表单上有一个按钮。我需要从 dataTemplate 更改矩形的比例(scaleTransform)。我应该如何访问上述按钮的 Button_Click 事件中的 'rectangleBarChart' 元素?

【问题讨论】:

【参考方案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  */
  

【讨论】:

谢谢伙计,我可以在找到元素后进入 if 块,但是在更改矩形的某些属性后假设 rectangle.Fill=Brushes.Red,这些更改不会反映回来。(我我正在使用上面提到的 dataTemplate 作为我的 ListBox 的 ItemTemplate)那么如何更新对 ListBox 的更改? 你是圣人!这很好用。我无法使用其他解决方案。【参考方案2】:

不要不要这样做。如果您需要更改 DataTemplate 中的某些内容,请绑定相应的属性并修改基础数据。另外我建议将Button.Command 绑定到您的数据/视图模型(请参阅MVVM)上的ICommand,而不是使用事件,那么您已经处于正确的上下文中并且视图不需要做任何事情。

【讨论】:

@H. B. - 我使用 DataTemplate 如下: 我可以在我的代码隐藏中访问 ListBox,但我想缩放矩形并将更改再次反映到 UI。为此我做了: rectangle.Fill = Brushes.MediumVioletRed;矩形.高度 = 10; rectangle.LayoutTransform = new ScaleTransform(2, 1); @GrowWithWPF:那又怎样?没有什么可以阻止您在模板中绑定所有这些属性并更改绑定的对象。

以上是关于在代码隐藏中的 DataTemplate 中查找 WPF 元素的主要内容,如果未能解决你的问题,请参考以下文章

怎么选择DataTemplate中的TextBox

WPF 中DATAGRID 里面的 RadioButton 怎么查找

所有列的 WPF GridView 共享单元格模板

[UWP]如何使用代码创建DataTemplate(或者ControlTemplate)

如何在代码中定义 DataTemplate?

在查找操作之后隐藏嵌套文档中的_id