XAML中声明的按钮不能在类中引用

时间:2019-02-20 03:26:45

标签: c# wpf xaml

我有一个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

2 个答案:

答案 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>();