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

Другие вопросы по тегам