На кнопку, объявленную в XAML, нельзя ссылаться в классе - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть 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 голосов
/ 20 февраля 2019

Этот универсальный метод расширения будет рекурсивно искать дочерние элементы нужного типа:

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

0 голосов
/ 20 февраля 2019

Из-за того, что ваша кнопка объявлена ​​в DataTemplate, вы не можете получить к ней доступ напрямую, как с объектами, объявленными вне ее.(DataTemplate предоставляет информацию для шаблонирования ваших объектов при добавлении в ItemsControl)

Если вы ожидаете, что у вас будет только один объект, вы можете удалить весь объект вокруг него и таким образом получить доступ к своей кнопке.

Если вы планируете иметь массив s в вашем, то вам нужно будет создать логику поиска, подобную логике с этого сайта: https://dzone.com/articles/how-access-named-control

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...