Я создал класс с именем ProductionDataUserControlBase, и он является производным от класса UserControl. Этот базовый класс не имеет XAML. Его цель - действовать в качестве базового класса для сетки, которую я инкапсулирую внутри класса, чтобы ее можно было изменить, когда класс наследуется позже. Внутри конструктора базового класса я также создаю столбцы и добавляю их в коллекцию Grid. Я создал открытое свойство Columns и все, что он делает - возвращает (получает) коллекцию свойств Columns сетки.
Я создал дочерний класс, производный от ProductionDataUserControlBase и содержащий XAML. В редакторе свойств унаследованного элемента управления существует моя коллекция Columns. Я могу открыть коллекцию через редактор свойств и добавить новые столбцы. Однако редактор столбцов не содержит столбцы, которые я добавил в основание, хотя я могу визуально видеть столбцы на холсте.
Я предполагаю, что это потому, что столбцы, которые я добавил в базу, не находятся в XAML дочернего элемента. Если я добавлю столбцы через дочерний XAML, он создаст дубликаты столбцов, потому что они были добавлены в базу. Как я могу отредактировать свойство столбцов, которые были добавлены в базу, без использования кода в дочернем элементе?
public partial class ProductionDataUserControlBase : UserControl
{
private RadGridView _grdProdData;
private Boolean _InitCalled = false; //Boolean variable used to control whether init was previously called.
//This is because the loaded event may be fired multiple times depending
//on what type of control it's been placed into.
public ProductionDataUserControlBase()
{
InitializeComponent();
}
public Telerik.Windows.Controls.GridViewColumnCollection Columns
{
get
{
return _grdProdData.Columns;
}
}
protected virtual void InitializeComponent()
{
if (!_InitCalled)
{
InitializeGrid();
Columns = _grdProdData.Columns;
this.AddChild(_grdProdData);
_InitCalled = true;
}
}
private void InitializeGrid()
{
Telerik.Windows.Controls.GridViewColumn grdCol = null;
this._grdProdData = new RadGridView();
this._grdProdData.AutoGenerateColumns = false;
grdCol = new Telerik.Windows.Controls.GridViewColumn() { HeaderText = "PSTAT", Name = "grdColPSTAT", UniqueName = "PSTAT" };
_grdProdData.Columns.Add(grdCol);
grdCol = new Telerik.Windows.Controls.GridViewColumn() { HeaderText = "PCONO", Name = "grdColPCONO", UniqueName = "PCONO" };
_grdProdData.Columns.Add(grdCol);
}
}
<ProductionDataUserControlBase x:Class="AmerenProductionDataUserControl"
xmlns:MSControls="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="clr-namespace:AmerenProductionDataUserControl;assembly=AmerenProductionDataUserControl" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">
</ProductionDataUserControlBase>
public partial class AmerenProductionDataUserControl : ProductionDataUserControlBase
{
public AmerenProductionDataUserControl()
{
InitializeComponent();
}
}