WP7 - Как получить доступ к свойствам кнопки в ресурсах-›style

У меня есть этот фрагмент кода в моем MainPage.xaml:

<phone:PhoneApplicationPage.Resources>
        <Style x:Key="ListBoxStyle" TargetType="ListBox">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
            <Setter Property="BorderThickness" Value="0"/>
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Setter Property="Padding" Value="0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBox">
                        <ScrollViewer x:Name="ScrollViewer" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" Padding="{TemplateBinding Padding}">
                            <StackPanel>
                                <ItemsPresenter/>
                                <Button x:Name="LoadMoreButton" Content="Load more data..." Background="{StaticResource PhoneAccentBrush}" Click="LoadMoreData_Click" Visibility="Collapsed" />
                            </StackPanel>
                        </ScrollViewer>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </phone:PhoneApplicationPage.Resources>

Мой вопрос заключается в том, как получить доступ, например, к свойству LoadMoreButton.Visibility в MainPage.xaml.cs?

Если я попытаюсь использовать LoadMoreButton.Visibility, intelisense ничего не вернет. Я предполагаю, что вы не можете использовать такие элементы ресурсов, но я надеюсь, что некоторые из вас знают решение этой «проблемы». Заранее спасибо!


person rjovic    schedule 16.08.2011    source источник
comment
Я знаю, что это не то, что вы ищете, но вот отличный пример и код для списка, который автоматически загружает больше, когда вы находитесь внизу. Это прекрасно работает, вы можете просто поместить TextBlock и неопределенный индикатор выполнения с надписью «загрузка еще ...», который пользователь увидит, когда дойдет до конца. blog.slimcode .com/2010/09/11/   -  person William Melani    schedule 16.08.2011
comment
спасибо .. Интересный способ реализовать поведение load more .. Я проверю :)   -  person rjovic    schedule 16.08.2011


Ответы (2)


Краткая версия: вы не можете.

Длинная версия: вы не можете, и я не понимаю, почему бы и нет. Сама идея наличия кнопки с именованием внутри ListBoxItem, что означает, что она отображается несколько раз, не имеет смысла.

Что вам действительно нужно сделать, так это привязать видимость к свойству. Рассмотрите возможность использования ValueConverter (поищите BoolToVisibilityConverter, и вы найдете), чтобы вы могли просто связать логическое свойство из элемента, который привязан к данным.

person Claus Jørgensen    schedule 16.08.2011
comment
Кнопка в вопросе не в теме, а в шаблоне всего ListBox. Я бы рекомендовал связывающий подход, хотя - person Matt Lacey; 17.08.2011
comment
Хммф, я думал, что прочитал ListBoxItem как TargetType в его коде. Глупые глаза. - person Claus Jørgensen; 17.08.2011

Используйте эту вспомогательную функцию:

        public static ChildItem FindVisualChild<ChildItem>(DependencyObject obj)
            where ChildItem : DependencyObject {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) {
                DependencyObject child = VisualTreeHelper.GetChild(obj, i);
                if (child != null && child is ChildItem) {
                    return (ChildItem)child;
                } else {
                    ChildItem childOfChild = FindVisualChild<ChildItem>(child);
                    if (childOfChild != null) {
                        return childOfChild;
                    }
                }
            }
            return null;
        }

Чтобы найти кнопку:

var button = FindVisualChild<Button>(listbox);
person Sinh Pham    schedule 16.08.2011