Domanda

Sto cercando di creare un controllo TreeView dal controllo TreeView di Silverlight. Ho i miei dati che vengono tirati da un servizio WCF che tira da EF. Tutti i dati sta arrivando in fine. Ho la pagina di predisporre, se posso inserire nome utente, fare clic su un pulsante e i dati popoleranno la prima generazione nel controllo TreeView. Quindi, sto costruendo dinamicamente TreeViewItems di mettere nel mio TreeView con un RoutedEventHandlers selezionati collegati a ciascuno di essi. Quando clicco su uno dei nodi TreeViewItem, che prende il via la funzione di tvi_Selected in cui voglio popolare TreeViewItems sotto la TreeViewItem che ho appena scelto.

mi imbatto in problema quando sono nella mia funzione di delegato prox_GetChildMembersCompleted. Non riesco a trovare un modo per fare un tipo di FindControl ricerca sul TreeViewItem che voglio aggiungere elementi figlio TreeViewItem a. Così, ho pensato che vorrei solo creare un campo protetto dove avrei memorizzare le informazioni di intestazione perché contengono solo nome utente. Ho solo bisogno di essere in grado di accedere a una TreeViewItem specifica intestazione o qualche altro metodo che mi allude.

Si può vedere che nella mia EventHandler selezionati, che sto ottenendo informazioni di intestazione lanciando l'oggetto mittente a un TreeViewItem. Nella funzione delegato prox_GetChildMembersCompleted che viene chiamata all'interno tvi_Selected, l'oggetto mittente è WCFDataClient quindi non può afferrare gli stessi dati da quel mittente. Qualsiasi comprensione di questo sarebbe molto apprezzato anche se lei suggerisce un metodo che è completamente diverso.

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


    }
}
È stato utile?

Soluzione

ho capito un modo per farlo. Sono andato e assegnato un nome alle TreeViewItems generate dinamicamente come nome utente. Ho anche memorizzato l'UserName mittente in una stringa protetta, allora si chiamava questa riga di codice per ottenere il TreeViewItem genitore:

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

Grazie per quello che sarebbe stato grandi risposte! :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top