在WPF中以编程方式访问CustomControl的元素

时间:2014-01-02 11:41:24

标签: wpf user-controls custom-controls apply-templates

我创建了一个自定义控件,只有一个Grid。

以下是Generic.xaml

代码的一部分
<Style TargetType="{x:Type local:MainView}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:MainView }">
                    <Grid x:Name="**PART_MyGrid**" Background="Black" Width="{TemplateBinding Width}"
              Height="{TemplateBinding Height}">
                        <ContentPresenter Content="{TemplateBinding Content}" />
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
 </Style>

对应的MainView.cs如下:

[TemplatePart(Name = "PART_MyGrid", Type = typeof(Grid))]
    public class MainView : ContentControl
    {
        private Grid MainViewGrid;
        static MainView()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MainView), new FrameworkPropertyMetadata(typeof(MainView)));
        }
        public override void OnApplyTemplate()
        {
            //This Function never gets called
            base.OnApplyTemplate();

            //Find the grid in the template once it's applied
            MainViewGrid = base.Template.FindName("**PART_MyGrid**", this) as Grid;
            //We can subscribe to its events
        }
        public void setGrid(DataGrid dtGrid)
        {
***//Exception saying MainViewGrid is null***
            MainViewGrid.Children.Add(dtGrid);
        }
    }

现在我已经创建了另一个项目,我希望以编程方式将这个自定义控件包含到其中一个面板中。

这是我在不同项目的.cs文件中所做的,我想在那里动态创建这个CustomControl。

CustomControlLib.MainView m_View = new CustomControlLib.MainView();

***//... Code to create One Datagrid programmatically ...***
   m_View.setGrid(programmatically_created_dataGrid);
   theTabItem.Content = m_View;
   theTabItem.DataContext = m_View.DataContext;

我想要的是,我想动态创建CustomControl,然后将其添加到TabItem。 因此,我想访问Grid中的CustomControl并以编程方式添加DataGrid。 但只有在屏幕上显示自定义控件时才会调用OnApplyTemplate()。 在我的情况下,它给出例外说"MainViewGrid is null" 那么,在这种情况下如何访问MainView CustomControl的元素,或者更确切地说是OnApplyTemplate(),以便我能够找到&#34;网格并向其添加DataGrid。

0 个答案:

没有答案