我创建了一个自定义控件,只有一个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。