powered by simpleCommunicator - 2.0.34     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как добраться до объекта, который находится внутри DataTemplate?
6 сообщений из 6, страница 1 из 1
Как добраться до объекта, который находится внутри DataTemplate?
    #39932724
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В App.xaml определен ComboBox с определенным именем
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<DataTemplate x:Key="SandSoilProps">
....
<ComboBox x:Name="CbSandBigness" Grid.Row="1" Grid.ColumnSpan="3">
 <ComboBoxItem>
  <TextBlock>Гравелистый</TextBlock>
 </ComboBoxItem>
 <ComboBoxItem>
  <TextBlock>Крупный</TextBlock>
 </ComboBoxItem>
</ComboBox>
...
</DataTemplate>


В нужном окне добавляю этот Template в StackPanel:
Код: c#
1.
2.
3.
4.
5.
6.
contentControl.SetResourceReference(ContentControl.ContentTemplateProperty, "SandSoilProps");
Binding binding = new Binding();
binding.Source = soil;
contentControl.SetBinding(ContentControl.ContentProperty, binding);
//MyStackPanel
StpProperties.Children.Add(contentControl);


Но добраться до этого комбобокса не могу. Надо получить индекс выделенного элемента в коде.
FindName для StackPanel не помогает, через LogicTreeHelper тоже не получилось. Нужно рекурсивно проходить по визуальному дереву, другого способа нет?
...
Рейтинг: 0 / 0
Как добраться до объекта, который находится внутри DataTemplate?
    #39932728
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У комбика есть свойство SelectedIndex вроде
...
Рейтинг: 0 / 0
Как добраться до объекта, который находится внутри DataTemplate?
    #39932732
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Это понятно, я не знаю как сам комбобокс получить в коде окна, где я использую DataTemplate, тогда как сам комбобокс определен в App.xaml
...
Рейтинг: 0 / 0
Как добраться до объекта, который находится внутри DataTemplate?
    #39932744
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений, Екатеринбург,

а зачем вам его вообще получать то? свяжите поле SelectedIndex с свойством вашей модели. Если у вас возникает такая потребность, значит вы делайте неправильно. Найти этот ComboBox в визуальном дереве возможно, но делать это не нужно.
Код: c#
1.
2.
3.
4.
5.
6.
contentControl.SetResourceReference(ContentControl.ContentTemplateProperty, "SandSoilProps");
Binding binding = new Binding();
binding.Source = soil;
contentControl.SetBinding(ContentControl.ContentProperty, binding);
//MyStackPanel
StpProperties.Children.Add(contentControl);

и вот такой вот кода быть не должно. Для этого есть XAML
...
Рейтинг: 0 / 0
Как добраться до объекта, который находится внутри DataTemplate?
    #39932748
Евгений, Екатеринбург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
а зачем вам его вообще получать то? свяжите поле SelectedIndex с свойством вашей модели.

Да, что-то я перемудрил. И все-таки, если мне когда-то понадобится получить ссылку на объект, то как это делать?
Roman Mejtes
и вот такой вот кода быть не должно. Для этого есть XAML

У меня иерархическая структура классов, в зависимости от подклассов я вывожу набор нужных панелей.
Грубо: есть класс животных. Если это птица, то добавляют панель "Крылья", если это перелетная птица, то добавляю панель "Длина перелета". Как я понимаю, это не сделать чисто на xaml без динамического кода.
...
Рейтинг: 0 / 0
Как добраться до объекта, который находится внутри DataTemplate?
    #39932942
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений, Екатеринбург
Roman Mejtes
а зачем вам его вообще получать то? свяжите поле SelectedIndex с свойством вашей модели.

Да, что-то я перемудрил. И все-таки, если мне когда-то понадобится получить ссылку на объект, то как это делать?
Roman Mejtes
и вот такой вот кода быть не должно. Для этого есть XAML

У меня иерархическая структура классов, в зависимости от подклассов я вывожу набор нужных панелей.
Грубо: есть класс животных. Если это птица, то добавляют панель "Крылья", если это перелетная птица, то добавляю панель "Длина перелета". Как я понимаю, это не сделать чисто на xaml без динамического кода.

найти элемент в визуальном дереве, можно вот так, но если вы его используйте, стоит задуматься о том, что вы делайте неправильно, крайне редко бывает необходимость найти объект в визуальном дереве. Обычно такое реализуют при создании элемента управления.
Тем более, что поиск вниз по дереву очень затратный, поиск обычно осуществляется вверх (к предкам). Для относительного связывания или поиска контейнера и т.д.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public static DependencyObject FindChild(DependencyObject parent, string name)
{
	// confirm parent and name are valid.
	if (parent == null || string.IsNullOrEmpty(name)) return null;

	if (parent is FrameworkElement && (parent as FrameworkElement).Name == name) return parent;

	DependencyObject result = null;

	if (parent is FrameworkElement) (parent as FrameworkElement).ApplyTemplate();

	int childrenCount = System.Windows.Media.VisualTreeHelper.GetChildrenCount(parent);
	for (int i = 0; i < childrenCount; i++)
	{
		var child = System.Windows.Media.VisualTreeHelper.GetChild(parent, i);
		result = FindChild(child, name);
		if (result != null) break;
	}
	return result;
}



Ваша проблема в том, что у вас нет ViewModel, а WPF очень сильно заточен на шаблон MVVM, не применяя этот шаблон, программировать в WPF очень неудобно
Модель представления для того и существует, чтоб упростить визуализацию этих объектов.
Работы будет в 2 раза больше, но система станет гибкой, связанность представления и модели будет сильно уменьшена.
А модель представления может быть универсальной для всех элементов модели такого типа.
Представьте как бы вы хотели видеть свой интерфейс и какие данные, в каком виде было бы наиболее удобно иметь, вот это и есть ваша ViewModel.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как добраться до объекта, который находится внутри DataTemplate?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]