WPF Как получить доступ к управлению из DataTemplate
У меня есть табличка с данными, которая содержит сетку, а внутри сетки у меня есть поле со списком.
<DataTemplate x:Key="ShowAsExpanded">
<Grid>
<ComboBox Name ="myCombo" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="5"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource MyItems}">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
</Grid>
</DataTemplate>
Затем у меня есть сетка, которая обращается к этому шаблону через стилизацию.
<Grid>
<ContentPresenter Name="_contentPresenter" Style="{DynamicResource StyleWithCollapse}" Content="{Binding}" />
</Grid>
Как я могу получить доступ через код, управляющий myCombo, чтобы в основном установить его DataContext?
3 ответа
Прежде всего, я даже не могу найти связь между ресурсом (ShowAsExpanded) и использованием внутри ContentPresenter. Но на данный момент давайте предположим, что DynamicResource должен указывать на ShowAsExpanded.
Вы не можете и не должны получать доступ к комбинированному списку с помощью кода. Вы должны привязать текстовый текст к сетке, которая использует стиль. Если вы не хотите этого делать, вам придется находить содержимое во время выполнения и искать дочерний выпадающий список.
Три способа, которые я знаю.
1. Используйте FindName
ComboBox myCombo =
_contentPresenter.ContentTemplate.FindName("myCombo",
_contentPresenter) as ComboBox;
2. Добавьте событие Loaded в ComboBox и получите к нему доступ
<ComboBox Name ="myCombo" Loaded="myCombo_Loaded" ...
private void myCombo_Loaded(object sender, RoutedEventArgs e)
{
ComboBox myCombo = sender as ComboBox;
// Do things..
}
3. Найдите это в Визуальном Дереве.
private void SomeMethod()
{
ComboBox myCombo = GetVisualChild<ComboBox>(_contentPresenter);
}
private T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
Вам нужно использовать FindName. проверить http://msdn.microsoft.com/en-us/library/system.windows.frameworktemplate.findname.aspx