Найдите Silverlight TreeViewItem Control по заголовку
-
22-09-2019 - |
Вопрос
Я пытаюсь создать дерево из управления Silverlight Treeview. У меня есть данные, полученные из службы WCF, которая вытаскивает из EF. Все данные поступают в порядке. У меня есть страница, на которой я могу ввести имя пользователя, нажать кнопку, и данные заполнят первое поколение в Treeview. Итак, я динамически строю TreeViewItems, чтобы положить в свое дерево с выбранными RouteDeventhandlers, прикрепленными к каждому. Когда я нажимаю на один из узлов TreeViewItem, он начинает функцию TVI_SELED, в которой я хочу заполнить TreeViewItems под TreeViewItem, которую я только что выбрал.
Я столкнулся с проблемой, когда я нахожусь в своей делегатной функции Prox_getchildmemberscompleted. Я не могу найти способ сделать поиск типа FindControl на TreeViewItem, к которому я хочу добавить элементы Dild TreeViewItem. Итак, я подумал, что просто создаю защищенное поле, где я буду хранить информацию о заголовке, потому что в нем содержатся только имя пользователя. Мне просто нужно иметь возможность получить доступ к конкретному TreeViewItem по заголовку или каким -либо другим методам, который намекает на меня.
Вы можете видеть это в моем выбранном Eventhandler, что я получаю информацию о заголовке, отменив объект отправителя в TreeViewItem. В функции делегата prox_getchildmememberscompleted, который называется внутри TVI_SELECTIC Любое понимание этого было бы очень оценено, даже если вы предложите метод, который совершенно другой.
<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);
Спасибо за то, что было бы отличными ответами! :)