在代码隐藏中的 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 元素的主要内容,如果未能解决你的问题,请参考以下文章
WPF 中DATAGRID 里面的 RadioButton 怎么查找