Найти элемент управления Silverlight TreeViewItem по заголовку

Я пытаюсь создать TreeView из элемента управления Silverlight TreeView. Мои данные извлекаются из службы WCF, которая извлекается из EF. Все данные поступают в порядке. У меня настроена страница, на которой я могу ввести имя пользователя, нажать кнопку, и данные будут заполнять первое поколение в TreeView. Итак, я динамически создаю TreeViewItems для размещения в моем TreeView с привязанным Selected RoutedEventHandlers к каждому. Когда я нажимаю на один из узлов TreeViewItem, он запускает функцию tvi_Selected, в которой я хочу заполнить TreeViewItems под TreeViewItem, который я только что выбрал.

Я сталкиваюсь с проблемой, когда я нахожусь в моей функции делегата prox_GetChildMembersCompleted. Я не могу найти способ сделать поиск типа FindControl для TreeViewItem, к которому я хочу добавить дочерние элементы TreeViewItem. Итак, я подумал, что я просто создам защищенное поле, в котором я буду хранить информацию заголовка, потому что она содержит только имя пользователя. Мне просто нужно иметь возможность получить доступ к определенному TreeViewItem с помощью заголовка или каким-либо другим методом, который намекает мне.

Вы можете видеть это в моем Выбранном обработчике событий, что я получаю информацию Заголовка, приводя объект отправителя к TreeViewItem. В делегатской функции prox_GetChildMembersCompleted, которая вызывается внутри tvi_Selected, объектом отправителя является WCFDataClient, поэтому я не могу получить те же данные от этого отправителя. Любое понимание этого будет высоко ценится, даже если вы предложите метод, который является совершенно другим.

<UserControl xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"  
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    x:Class="FloLOS2.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
  <Grid x:Name="LayoutRoot" Background="#5C7590">
        <StackPanel>
            <TextBox x:Name="txtUserName" Width="120" Margin="5"></TextBox>
            <TextBlock x:Name="txtFillBlock" Width="300" Margin="5" Foreground="White" Text="Change me"></TextBlock> 
            <Button x:Name="btnSubmit" Margin="5" Content="Get Frontline" Width="120" Click="btnSubmit_Click" />
            <data:DataGrid x:Name="MembersGrid" Margin="5"></data:DataGrid>
            <controls:TreeView x:Name="MembersTree" Margin="5"></controls:TreeView>
        </StackPanel>
    </Grid>
</UserControl>



namespace FloLOS2
{
    public partial class MainPage : UserControl
    {
        string sParentID;

        public MainPage()
        {
            InitializeComponent();
        }

        private void btnSubmit_Click(object sender, RoutedEventArgs e)
        {
            GetMyDataRef.GetMyDataClient prox = new FloLOS2.GetMyDataRef.GetMyDataClient();
            prox.GetMembersCompleted += new EventHandler<FloLOS2.GetMyDataRef.GetMembersCompletedEventArgs>(prox_GetMembersCompleted);
            prox.GetMembersAsync(txtUserName.Text);
        }

        void prox_GetMembersCompleted(object sender, FloLOS2.GetMyDataRef.GetMembersCompletedEventArgs e)
        {
            GetMyDataRef.Member[] members = e.Result.ToArray();

            foreach (var x in members)
            {
                TreeViewItem tvi = new TreeViewItem() { Header = x.UserName };
                tvi.Selected += new RoutedEventHandler(tvi_Selected);
                MembersTree.Items.Add(tvi);
            }

            //MembersTree.Items.Add(tvi);
        }

        void prox_GetChildMembersCompleted(object sender, FloLOS2.GetMyDataRef.GetMembersCompletedEventArgs e)
        {
            GetMyDataRef.Member[] members = e.Result.ToArray();
            TreeViewItem tviParent = new TreeViewItem();
            // *** Find TreeViewItem control based on Header  ***

            foreach (var x in members)
            {
                TreeViewItem tviChild = new TreeViewItem() { Header = x.UserName };
                tviChild.Selected += new RoutedEventHandler(tvi_Selected);
                tviParent.Items.Add(tviChild);
            }

        }

        void tvi_Selected(object sender, RoutedEventArgs e)
        {
            try
            {

                TreeViewItem item = (TreeViewItem)sender;
                txtFillBlock.Text = item.Header.ToString();
                sParentID = item.Header.ToString();

                GetMyDataRef.GetMyDataClient prox = new FloLOS2.GetMyDataRef.GetMyDataClient();
                prox.GetMembersCompleted += new EventHandler<FloLOS2.GetMyDataRef.GetMembersCompletedEventArgs>(prox_GetChildMembersCompleted);
                prox.GetMembersAsync(item.Header.ToString());

            }
            catch (Exception ex)
            {
                txtFillBlock.Text = ex.InnerException.ToString();
            }
        }


    }
}

1 ответ

Решение

Я нашел способ сделать это. Я пошел и назначил имя для динамически генерируемых TreeViewItems в качестве имени пользователя. Я также сохранил имя пользователя отправителя в защищенной строке, а затем вызвал эту строку кода, чтобы получить родительский TreeViewItem:

    TreeViewItem tviParent = (TreeViewItem)LayoutRoot.FindName(sParentID);

Спасибо за то, что были бы отличные ответы!:)

Другие вопросы по тегам