Я новичок в программировании WPF и С#.
Я пытаюсь создать из кода TreeView для добавления данных из моей базы данных. Данные разделены на две части:
У меня первая часть данных это основной TreeViewItem, а вторые, даты, висят от первой в TreeView. Все данные формируются в виде строки.
Я добавляю их в свой TreeView следующим образом:
// Adding new client to TreeView
TreeViewItem item = new TreeViewItem();
item.Header = entry.Key;
item.ItemsSource = entry.Value.ToArray(); // Adding also the dates
item.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Here is the problem
try
{
Arbol_Clientes.Items.Add(item);
}
catch( Exception error)
{
Console.WriteLine("ERROR: " + error.ToString());
}
Проблема в том, что когда я нажимаю на дату TreeView, событие вызывается именем клиента, например:
Когда я дважды щелкаю красную дату, событие получает синий TreeViewItem как тот, который вызвал обработчик, в коде обработчика hijo — это "ABM" вместо "/2019 0:00:00":
Код обработчика:
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs {
var hijo = sender as TreeViewItem;
ItemsControl parent = GetSelectedTreeViewItemParent(hijo);
TreeViewItem treeitem = parent as TreeViewItem;
string Nombre_Cliente = treeitem.Header.ToString();
Etiqueta.Content = Nombre_Cliente + " " + hijo.Header.ToString();
}
Конечный результат, которого я хочу добиться со всем этим, выглядит примерно так: xaml:
<TreeView Grid.Column = "0" BorderThickness = "0" x:Name = "Arbol_Clientes">
<TreeViewItem Header = "ABM" IsExpanded = "True">
<TreeViewItem Header = "Enero 2019" MouseDoubleClick = "TreeViewItem_MouseDoubleClick"/>
<TreeViewItem Header = "Febrero 2019" MouseDoubleClick = "TreeViewItem_MouseDoubleClick"/>
</TreeViewItem>
<TreeViewItem Header = "VCF" IsExpanded = "True">
<TreeViewItem Header = "Enero 2019" MouseDoubleClick = "TreeViewItem_MouseDoubleClick"/>
</TreeViewItem>
</TreeView>
Мне не хватает написать, что я начинаю программировать на этом языке и в этой IDE, поэтому я не очень понимаю эти ответы, поэтому я действительно не знаю, сможет ли этот поток решить мою проблему. Я попробую, но мне нужно изучить многое из того, что ответил пользователь. Спасибо.
Чем вам будет лучше сначала понять основы MVVM, а также WPF и концепции привязки.
@PavelAnikhouski Эта ветка не имеет отношения к этому вопросу.





item.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Here is the problem
Вы не получаете события для элементов даты, потому что не подписываетесь на эти элементы. Только узлы верхнего уровня присоединяют событие. Вы захотите подписаться на событие для дочерних элементов
Вместо этого попробуйте следующее:
// Adding new client to TreeView
TreeViewItem item = new TreeViewItem();
item.Header = entry.Key;
foreach (var date in entry.Value.ToArray())
{
var child = new TreeViewItem();
child.Header = date;
child.MouseDoubleClick += TreeViewItem_MouseDoubleClick; // Only subscribe to the child
item.Items.Add(child);
}
try
{
Arbol_Clientes.Items.Add(item);
}
catch (Exception error)
{
Console.WriteLine("ERROR: " + error.ToString());
}
Вы можете получить ссылку на родителя TreeViewItem выбранного элемента (e.OriginalSource), используя класс VisualTreeHelper:
private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
var hijo = FindParent<TreeViewItem>(e.OriginalSource as DependencyObject);
//...
}
private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
var parent = VisualTreeHelper.GetParent(dependencyObject);
if (parent == null) return null;
var parentT = parent as T;
return parentT ?? FindParent<T>(parent);
}
Это именно то, что я искал! Спасибо, работает нормально!
Попробуйте проверить существующую тему stackoverflow.com/questions/4497825/….