グリッドを 1 つだけ持つカスタム コントロールを作成しました。
これがコードの一部です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);
}
}
別のプロジェクトを作成したので、このカスタム コントロールをプログラムでパネルの 1 つに含めたいと思います。
これは、この CustomControl を動的に作成したかった別のプロジェクトの .cs ファイルで行ったことです。
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()
、Custom コントロールが画面に表示されている場合にのみ呼び出されます。私の場合、"MainViewGrid is null"
この場合、MainView CustomControl の要素にアクセスするにはどうすればよいか、という例外を与えてOnApplyTemplate()
、Grid を「見つけて」DataGrid を追加できるようにします。