Question

Je suis en train de créer un TreeView du contrôle Silverlight TreeView. J'ai mes données tirées d'un service WCF qui tire de EF. Toutes les données sont transmises à bien. J'ai la page mis en place où je peux entrer un UserName, cliquez sur un bouton, et les données peupleront la première génération dans l'arborescence. Donc, je suis dynamique TreeViewItems la construction pour mettre dans mon TreeView avec RoutedEventHandlers sélectionnés attachés à chacun. Lorsque je clique sur un des nœuds TreeViewItem, il lance la fonction tvi_Selected dans laquelle je veux remplir TreeViewItems sous la TreeViewItem que je viens sélectionné.

je tombe problème quand je suis dans ma fonction de délégué prox_GetChildMembersCompleted. Je ne peux pas trouver un moyen de faire un type de FindControl recherche sur la TreeViewItem que je veux ajouter les éléments de TreeViewItem enfant à. Donc, je pensais que je voudrais juste créer un champ protégé où je stocker les informations en-tête parce qu'il contient seulement le UserName. J'ai juste besoin de pouvoir accéder à un TreeViewItem spécifique en-tête ou une autre méthode qui me faisant allusion.

Vous pouvez voir que dans mon sélectionné eventhandler, que je reçois les informations d'en-tête en lançant l'objet émetteur à un TreeViewItem. Dans la fonction de délégué prox_GetChildMembersCompleted qui est appelé à l'intérieur de tvi_Selected, l'objet émetteur est WCFDataClient je ne peux pas saisir les mêmes données de cet expéditeur. Toute idée dans ce serait très apprécié même si vous proposez une méthode qui est complètement différent.

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


    }
}
Était-ce utile?

La solution

Je me suis trouvé un moyen de le faire. Je suis allé et attribuer un nom aux TreeViewItems générées dynamiquement comme le UserName. J'ai aussi emmagasinés l'expéditeur UserName dans une chaîne protégée, alors appelé cette ligne de code pour obtenir le TreeViewItem parent:

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

Merci pour ce qui aurait été super réponses! :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top