0

グリッドを 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 を追加できるようにします。

4

0 に答える 0