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

C# 在代码隐藏中的DataTemplate中查找WPF元素,c#,wpf,xaml,datatemplate,bar-chart,C#,Wpf,Xaml,Datatemplate,Bar Chart,我有一个数据模板 <Window.Resources> <DataTemplate x:Key="BarChartItemsTemplate"> <Border Width="385" Height="50"> <Grid> <Rectangle Name="rectangleBarChart" Fill="MediumOrchid" StrokeThi

我有一个数据模板

<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)。如何访问上述按钮的按钮单击事件中的“矩形条形图”元素?

我在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;
       }
   }
}
public IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
for(int i=0;i
用法:

foreach (var rectangle in FindVisualChildren<Rectangle>(this))
{
  if (rectangle.Name == "rectangleBarChart")
  {
    /*   Your code here  */
  }
}
foreach(FindVisualChildren中的变量矩形(this))
{
if(rectangle.Name==“矩形条形图”)
{
/*你的代码在这里*/
}
}

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

谢谢,在找到元素后,我能够进入if块,但是在更改了矩形的一些属性之后,假设rectangle.Fill=brusks.Red,这些更改不会被反射回来。(我正在使用上面提到的dataTemplate作为列表框的ItemTemplate),那么如何更新列表框的更改呢?你真是个圣人!这很有效。我无法使用其他解决方案。@H.B.-我使用的数据模板如下:我可以在我的代码中访问列表框,但我想缩放矩形并将更改再次反映到UI。为此我做了:rectangle.Fill=brusks.MediumVioletRed;矩形,高度=10;rectangle.LayoutTransform=新的ScaleTransform(2,1)@那又怎样?没有任何东西可以阻止您绑定模板中的所有这些属性并更改绑定对象。