Ваш DataTemplate
будет накачен, а затем добавлен в визуальное дерево 'datform'.Таким образом, вы можете найти эти элементы путем рекурсивного поиска в визуальном дереве с использованием класса VisualTreeHelper
.
Код доказательства концепции:
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
// Find all TextBox visual children named "txtAddress" starting with the datform control
var txtAddressMatches = GetVisualChildWithName("txtAddress", datform).OfType<TextBox>();
// Fina all ComboBox visual children named "Cm_Name" starting with the datform control
var Cmb_NameMatches = GetVisualChildWithName("Cm_Name", datform).OfType<ComboBox>();
}
private IEnumerable<FrameworkElement> GetVisualChildWithName(string name, FrameworkElement element)
{
return GetVisualChildWithName(name, element, new List<FrameworkElement>());
}
private IEnumerable<FrameworkElement> GetVisualChildWithName(string name, FrameworkElement element, IEnumerable<FrameworkElement> matches)
{
if (element == null)
{
return matches;
}
if (element.Name == name)
{
matches = matches.Concat(new []{element});
}
for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
{
matches = matches.Concat(GetVisualChildWithName(name, VisualTreeHelper.GetChild(element, i) as FrameworkElement, new List<FrameworkElement>()));
}
return matches;
}
VisualTreeHelper
В классе есть статические методы, которые позволяют вам обнаружить все дочерние и родительские отношения для данного элемента (среди прочего).Дополнительную информацию можно найти здесь:
MSDN на VisualTreeHelper
Имейте в виду, что при обходе дерева визуалов нет гарантии нахождения уникальных имен, поэтому в примереКод выше, я возвращаю список совпадений.Это может произойти, например, если бы мы назвали элементы в DataTemplate
, применяемые к каждому элементу в ItemsControl
.Если бы мы начали поиск визуального дерева в ItemsControl
, мы бы обнаружили именованные элементы в шаблоне один раз для каждого элемента контейнера (например, ListBoxItem
).
Изменение кода выше, чтобы иметь глубину поиска, было бы тривиально, но, надеюсь, вы поняли:)