Pregunta

Estoy tratando de crear una vista de árbol desde el control Silverlight TreeView. Tengo mis datos extraídos de un servicio WCF que extrae de EF. Todos los datos están llegando bien. Tengo la página configurada donde puedo ingresar un nombre de usuario, hacer clic en un botón y los datos llenarán la primera generación en TreeView. Por lo tanto, estoy construyendo dinámicamente TreeViewitems para poner en mi View con un RoutedEdlers seleccionado unidos a cada uno. Cuando hago clic en uno de los nodos TreeViewitem, inicia la función TVI_Selected en la que quiero llenar TreeViewitems debajo del TreeViewitem que acabo de seleccionar.

Me encuentro con un problema cuando estoy en mi función delegada prox_getchildMembersCompleted. No puedo encontrar una manera de hacer una búsqueda de tipo FindControl en TreeViewitem a la que quiero agregar los elementos de Viewitem Child TreeView. Entonces, pensé que solo crearía un campo protegido donde almacenaría la información del encabezado porque contiene solo el nombre de usuario. Solo necesito poder acceder a un TreeViewitem específico por encabezado o algún otro método que me alude.

Puede ver eso en mi EventHandler seleccionado, que estoy obteniendo la información del encabezado lanzando el objeto del remitente a un TreeViewitem. En la función delegada prox_getChildMembersCompleted que se llama dentro de TVI_Selected, el objeto del remitente es wcfdataClient, por lo que no puedo obtener los mismos datos de ese remitente. Cualquier idea de esto sería muy apreciada incluso si sugiere un método que es 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();
            }
        }


    }
}
¿Fue útil?

Solución

Descubrí una forma de hacerlo. Fui y asigné un nombre a los árboles de árbol generados dinámicamente como el nombre de usuario. También almacené el nombre de usuario del remitente en una cadena protegida, luego llamé a esta línea de código para obtener el TreeViewitem principal:

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

¡Gracias por lo que hubiera sido una gran respuesta! :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top