我有一个button
,我在Stack Panel
中声明,如下所述。我想访问班级中的按钮,以便可以更改可见性,例如myButton.Visibility = Visibility.Hidden
,但这只是表明myButton
不存在。 XAML stack panel
似乎是私密的,我不知道为什么。
XAML
<ItemsControl x:Name="ic">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}" Foreground="White" TextWrapping="Wrap" FontSize="12" Margin="0, 0, 0, 0" Width="100" VerticalAlignment="Center" Padding="0"/>
<Button x:Name="myButton" Content="X" Foreground="Red" Width="15" Height="15" Background="Transparent" VerticalAlignment="Top" BorderThickness="0" Padding="0" Click="Remove_Click"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Class
myButton.Visibility = Visibility.Hidden; //myButton doesn't exist in current context
答案 0 :(得分:0)
由于在DataTemplate中声明了按钮,因此无法像在其外部声明的对象那样直接访问它。 (DataTemplate在添加到ItemsControl时提供了信息以模板化您的对象)
如果您希望只有一个,则可以删除其周围的整个对象,并以此方式访问Button。
如果您打算在中包含s数组,则必须考虑制定一种搜索逻辑,例如来自本网站的搜索逻辑: https://dzone.com/articles/how-access-named-control
答案 1 :(得分:0)
此通用扩展方法将递归搜索所需类型的子元素:
public static T GetChildOfType<T>(this DependencyObject depObj)
where T : DependencyObject
{
if (depObj == null)
return null;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = (child as T) ?? GetChildOfType<T>(child);
if (result != null) return result;
}
return null;
}
因此,您可以像这样ic.GetChildOfType<Button>();