Pergunta

Estou tentando criar um TreeView do Silverlight TreeView Control. Eu tenho meus dados sendo extraídos de um serviço WCF que retira da EF. Todos os dados estão chegando. Eu tenho a página configurada onde posso inserir um nome de usuário, clique em um botão e os dados preencherão a primeira geração no TreeView. Então, estou construindo dinamicamente o TreeViewItems para colocar no meu TreeView com um RouteDeventHandlers selecionado anexado a cada um. Quando clico em um dos nós do TreeViewItem, ele inicia a função TVI_Selected na qual quero preencher o TreeViewItems sob o TreeViewItem que acabei de selecionar.

Encontro problemas quando estou na minha função delegada prox_getChildMembersCompleted. Não consigo descobrir uma maneira de fazer uma pesquisa do tipo FindControl no TreeViewItem para o qual eu quero adicionar os elementos do Child TreeViewItem. Então, pensei em criar um campo protegido para o qual eu armazenaria as informações do cabeçalho, porque ele contém apenas o nome de usuário. Eu só preciso poder acessar um TreeViewItem específico por cabeçalho ou algum outro método que está me aludindo.

Você pode ver que, no meu EventHandler selecionado, estou recebendo as informações do cabeçalho lançando o objeto do remetente para um TreeViewItem. Na função delegada prox_getChildMembersCompleted que é chamada dentro do TVI_Selected, o objeto do remetente é wcfdataclient para que eu não possa pegar os mesmos dados desse remetente. Qualquer visão sobre isso seria muito apreciada, mesmo se você sugerir um método completamente diferente.

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


    }
}
Foi útil?

Solução

Eu descobri uma maneira de fazer isso. Fui atribuído um nome ao TreeViewItems gerado dinamicamente como nome de usuário. Eu também armazenei o nome de usuário do remetente em uma string protegida e, em seguida, chamei essa linha de código para obter o pai -TreeViewItem:

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

Obrigado pelo que teria sido ótimas respostas! :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top