Я пытаюсь динамически добавить кнопку в WrapPanel, который находится внутри Grid, но ссылка WrapPanel ( _innerPanel свойство ) недействительна, пока не будет вызван OnApplyTemplate.
Здесьтакое XMAL:
<s:MyGrid>
<WrapPanel x:Name="PART_InnerPanel">
</WrapPanel>
</s:MyGrid>
Класс MyGrid:
public class MyGrid: Grid
{
WrapPanel _innerPanel;
public WrapPanel Panel
{
get{return _innerPanel;}
}
static MyGrid()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyGrid), new FrameworkPropertyMetadata(typeof(MyGrid)));
}
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
_innerPanel = Template.FindName("PART_InnerPanel", this) as WrapPanel;
if (_innerPanel == null)
throw new ResourceReferenceKeyNotFoundException("Invalid template");
}
}
Внутри кода:
MyGrid g = new MyGrid();
g.ApplyTemplate(); // <-- doesn't do anything
g.UpdateLayout(); // <-- doesn't do anything
if(g.Panel != null) // <-- it's NULL here as OnApplyTemplate hasn't get called
{
g.Panel.Children.Add(new Button());
}
Как получить ссылку на WrapPanel, определенную в XAMLсразу после строки
MyGrid g = new MyGrid();
Или какой-нибудь обходной путь или лучший способ сделать это?