невозможно динамически добавлять кнопки управления в список в приложении Windows Phone - PullRequest
0 голосов
/ 05 января 2012

Я пытаюсь динамически добавлять различные элементы управления кнопками внутри списка для каждого элемента списка вместе с данными при его заполнении.Чтобы добиться этого, под тегом datatemplate я добавил новую панель стека, в которую я поместил кнопки управления.Теперь я пытаюсь найти конкретную панель стека, в которую помещаются кнопки, а затем сделать ее видимой истинной или ложной в зависимости от моего состояния.Итак, я попытался найти нужную панель стека, чтобы получить контроль над ней посредством циклического перемещения элементов списка.Тем не менее, я получаю «Null Reference Exception» при итерации элементов списка.Ниже приведен мой код xaml, а позже - мой код xaml.cs:

               <ListBox x:Name="TripList" Height="465" HorizontalAlignment="Left" VerticalAlignment="Top" Width="456" Background="White" Foreground="Blue">
                    <ListBox.ItemTemplate>
                        <DataTemplate>

                            <Border BorderBrush="Black" BorderThickness="0,0,0,4">
                                <StackPanel Orientation="Vertical" Width="456">
                                    <StackPanel Orientation="Vertical">
                                        <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                            <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" Width="370" FontSize="24" Text="{Binding PUDetails}"/>
                                            <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="24" Text="{Binding TripStatus}"/>
                                        </StackPanel>
                                        <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal" Width="300">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Conf: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding ConfNumber}"/>
                                            </StackPanel>
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Est Do Tm: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding DOTime}"/>
                                            </StackPanel>
                                        </StackPanel>
                                        <StackPanel VerticalAlignment="Top" Orientation="Vertical">
                                            <StackPanel x:Name="stacktest" Background="Azure" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Svc: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding TripService}"/>
                                            </StackPanel>
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="PU: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding PURoute}"/>
                                            </StackPanel>
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="DO: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding DORoute}"/>
                                            </StackPanel>
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Pax: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding PaxDetails}"/>
                                            </StackPanel>
                                        </StackPanel>
                                    </StackPanel>
                                       <StackPanel x:Name="stknotchecked" VerticalAlignment="Top" Orientation="Vertical">

                                            <StackPanel Orientation="Horizontal">
                                                <Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="300" x:Name="btnaccepttrip" Content="accept trip"></Button>
                                            </StackPanel>
                                            <StackPanel Orientation="Horizontal">
                                                <Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btnrejecttrip" Content="reject"></Button>
                                                <Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btnshowmap" Content="show map"></Button>
                                            </StackPanel>
                                        </StackPanel>
                                       <StackPanel x:Name="stkaccepted">
                                            <StackPanel Orientation="Horizontal">
                                                <Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btndirections" Content="directions"></Button>
                                                <Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btnflightinfo" Content="flight info"></Button>
                                            </StackPanel>
                                            <StackPanel Orientation="Horizontal">
                                                <Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btndetails" Content="details"></Button>
                                                <Button Background="Gray" Foreground="CadetBlue" VerticalAlignment="Top" Width="110" x:Name="btnlogtimes" Content="log times"></Button>
                                            </StackPanel>
                                            <StackPanel>
                                                <Button x:Name="btnstatus" Content="set status"></Button>
                                            </StackPanel>
                                        </StackPanel>
                                 </StackPanel>
                            </Border>

                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>



    private void addbtncontrols()
    {

        foreach (TripsList lst in TripList.Items)
        {
            ListBoxItem item = TripList.ItemContainerGenerator.ContainerFromItem(lst) as ListBoxItem;
            Button stk = FindFirstElementInVisualTree<Button>(item);
            var stkitem =(Button)stk.FindName("btndirections");
            stkitem.Visibility = Visibility.Collapsed;   
        }
     }

    private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
    {
        var count = VisualTreeHelper.GetChildrenCount(parentElement);
        if (count == 0)
            return null;

        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(parentElement, i);

            if (child != null && child is T)
            {
                return (T)child;
            }
            else
            {
                var result = FindFirstElementInVisualTree<T>(child);
                if (result != null)
                    return result;

            }
        }
        return null;
      }

Может кто-нибудь сообщить мне, как решить мою проблему.Заранее спасибо ..

Ответы [ 2 ]

0 голосов
/ 05 января 2012

Из приведенного выше описания, можете ли вы предоставить больше информации об этом:

  1. Где вы вызывали метод addbtncontrol?Если вы отвечаете на событие, скажем: добавьте еще один элемент, то это должно быть сделано внутри ViewModel.
  2. "ваше состояние": какое условие?Можем ли мы смоделировать его в элементе Listbox ViewModel?

Я реализовал нечто такое же: Listbox с динамическими элементами и пользовательским шаблоном.Также предоставьте возможность добавлять новый элемент.Поэтому, если вы дадите мне больше информации о том, чего вы хотите достичь, или улучшите модель представления, я могу помочь.

0 голосов
/ 05 января 2012

Навигация по дереву визуалов для определения местоположения этих элементов и настройки их видимости вручную - неправильный способ решения этой проблемы! Я вижу, что вы используете привязку данных. Почему бы не предоставить различные свойства типа Visibility в модели или модели представления, которые вы привязываете к пользовательскому интерфейсу, затем вы можете привязать их к свойству Visibility различных элементов пользовательского интерфейса, чтобы показать / скрыть их.

Кроме того, узнав о стилях, у вас в XAML есть множество повторяющихся свойств стилей, которые делают его длинным и трудным для понимания. Вы должны быть в состоянии определить стиль TextBlock, который применяется ко всем вашим TextBlocks, чтобы удалить большую часть повторяющегося кода в вашем вопросе.

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