【问题标题】:Find a WPF element inside DataTemplate in the code-behind在代码隐藏中的 DataTemplate 中查找 WPF 元素
【发布时间】: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' 元素?

【问题讨论】:

    标签: c# wpf xaml datatemplate bar-chart


    【解决方案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:那又怎样?没有什么可以阻止您在模板中绑定所有这些属性并更改绑定的对象。
    猜你喜欢
    • 2010-11-20
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    相关资源
    最近更新 更多