Frage

Ich versuche, eine Treeview aus der Silverlight TreeView -Steuerung zu erstellen. Ich habe meine Daten aus einem WCF -Dienst gezogen, der von EF stammt. Alle Daten sind in Ordnung. Ich habe die Seite eingerichtet, an der ich einen Benutzernamen eingeben kann, klicken Sie auf eine Schaltfläche, und die Daten füllen die erste Generation in der TreeView. Ich baue also TreeViewItems dynamisch auf, um sie mit einer ausgewählten RoutEDEventHandlern in meine Treeview zu bringen, die an jedem angeschlossen ist. Wenn ich auf einen der TreeViewItem -Knoten klicke, startet er die Funktion TVI_Selected, in der ich TreeViewItems unter dem von mir ausgewählten TreeViewItem bevölkern möchte.

Ich stieß auf ein Problem zu, wenn ich in meiner Delegate -Funktion prox_getChildmembers bin. Ich kann keinen Weg finden, um einen FindControl -Typ auf dem TreeViewItem zu durchzuführen, zu dem ich die Child TreeViewItem -Elemente hinzufügen möchte. Also dachte ich, ich würde nur ein geschütztes Feld erstellen, auf dem ich die Header -Informationen speichern würde, weil es nur den Benutzernamen enthält. Ich muss nur in der Lage sein, über einen Kopfball oder eine andere Methode auf ein bestimmtes TreeViewItem zugreifen zu können, die mich anspielt.

Sie können sehen, dass ich in meinem ausgewählten EventHandler die Header -Informationen erhalte, indem ich das Absenderobjekt in ein TreeViewItem überlegte. In der Delegate -Funktion prox_getChildmembersCompleted, die in TVI_Selected bezeichnet wird, ist das Absenderobjekt WCFDataClient, sodass ich nicht dieselben Daten von diesem Absender abrufen kann. Jeder Einblick in dies wäre sehr geschätzt, selbst wenn Sie eine völlig andere Methode vorschlagen.

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


    }
}
War es hilfreich?

Lösung

Ich fand einen Weg, es zu tun. Ich habe den dynamisch generierten TreeViewItems als Benutzername einen Namen zugewiesen. Ich habe auch den Sender -Benutzernamen in einer geschützten Zeichenfolge gespeichert und dann diese Codezeile genannt, um das übergeordnete TreeViewItem zu erhalten:

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

Vielen Dank für die tolle Antworten! :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top