2009-09-08 51 views
3

我想從Silverlight TreeView控件創建一個TreeView。我的數據是從EF提取的WCF服務中提取的。所有的數據都沒有問題。我可以在頁面上設置我可以輸入用戶名的位置,單擊按鈕,數據將填充TreeView中的第一代。所以,我動態地構建了TreeViewItems,並將其放入我的TreeView中,並在每個TreeView上連接了一個Selected RoutedEventHandlers。當我點擊其中一個TreeViewItem節點時,它啓動了我想在我剛剛選擇的TreeViewItem下填充TreeViewItems的tvi_Selected函數。通過標題查找Silverlight TreeViewItem控件

我在我的委託函數prox_GetChildMembersCompleted中遇到問題。我無法找到一種方法來對我想要添加子TreeViewItem元素的TreeViewItem執行FindControl類型查找。所以,我認爲我只是創建一個受保護的字段,在那裏我將Header信息存儲到它,因爲它只包含UserName。我只需要能夠通過Header或其他暗示我的方法來訪問特定的TreeViewItem。

你可以看到,在我選擇的事件處理程序中,我通過將發件人對象強制轉換爲TreeViewItem來獲取標題信息。在tvi_Selected內部調用的委託函數prox_GetChildMembersCompleted中,發件人對象是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(); 
      } 
     } 


    } 
} 

回答

1

我想出了一個辦法。我去爲動態生成的TreeViewItems指定一個名稱作爲用戶名。我還存儲了用戶名發送者在受保護的字符串,然後叫這行代碼來獲取父的TreeViewItem:

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

感謝什麼將是偉大的答案! :)