سؤال

أحاول إنشاء TreeView من التحكم في Silverlight Treeview. لقد تم سحب البيانات الخاصة بي من خدمة WCF التي تسحب من EF. كل البيانات تأتي بشكل جيد. لديّ الصفحة إعداد حيث يمكنني إدخال اسم مستخدم ، وانقر فوق زر ، وسوف تقوم البيانات بملء الجيل الأول في TreeView. لذلك ، أقوم ببناء TreeViewItems ديناميكيًا لوضعه في TreeView مع محددات TroutedEventHandlers المحددة المرفقة بكل واحد. عندما أنقر على إحدى عقد TreeViewItem ، فإنه ينطلق من وظيفة TVI_Selected التي أريد ملء TreeViewItems تحت TreeViewItem التي اخترتها للتو.

أواجه مشكلة عندما أكون في وظيفة المندوبين الخاصة بي PROX_GETCHILDMEMBESSCOMPLETED. لا يمكنني اكتشاف طريقة لإجراء البحث عن نوع induckontrol على treeviewitem التي أريد إضافة عناصر Child TreeViewItem إليها. لذلك ، اعتقدت أنني سأقوم فقط بإنشاء مجال محمي حيث أقوم بتخزين معلومات الرأس إليه لأنه يحتوي فقط على اسم المستخدم. أنا فقط بحاجة إلى أن أكون قادرًا على الوصول إلى TreeViewItem معين بواسطة Header أو طريقة أخرى تلمحني.

يمكنك أن ترى ذلك في جهاز EventHandler المحدد ، أحصل على معلومات الرأس عن طريق إلقاء كائن المرسل إلى TreeViewItem. في وظيفة المندوب PROX_GETCHILDMEMBESSCOMPLETED التي تسمى داخل tvi_selected ، يكون كائن المرسل هو wcfdataclient لذلك لا يمكنني الحصول على نفس البيانات من هذا المرسل. أي نظرة ثاقبة في هذا سيكون موضع تقدير كبير حتى لو اقترحت طريقة مختلفة تمامًا.

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


    }
}
هل كانت مفيدة؟

المحلول

لقد اكتشفت طريقة للقيام بذلك. ذهبت وخصصت اسمًا إلى TreeViewItems التي تم إنشاؤها ديناميكيًا كاسم المستخدم. قمت أيضًا بتخزين اسم مستخدم المرسل في سلسلة محمية ، ثم دعا هذا السطر من التعليمات البرمجية للحصول على TreeViewitem:

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

شكرا على ما كان سيكون إجابات رائعة! قون

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top