Я создаю серию UserControls, которые имеют похожую бизнес-логику. Поэтому я попытался реализовать эту общую бизнес-логику в абстрактном базовом классе, от которого наследуются все эти пользовательские элементы управления. Цепочка наследования выглядит примерно так:
System.Windows.Controls.UserControl <- MyControlBase (abstract) <- MyControl1, MyControl2 и т. Д. </p>
Я создал классы MyControl1, MyControl2 и т. Д. В качестве пользовательских элементов управления в Visual Studio. Я установил классы для наследования от MyControlBase вместо System.Windows.Controls.UserControl. Это прекрасно работает ... пока я не внесу изменения в XAML и не сохраню заново. Затем Visual Studio 2008 переназначает сгенерированный класс для наследования от System.Windows.Controls.UserControl.
Пример кода классов и XAML:
// MyControlBase.cs:
public abstract class MyControlBase.Windows.Controls.UserControl
{
public abstract void DoOperation1();
}
// MyControlBase.xaml: none
// MyControl1.cs:
public partial class MyControl1: MyControlBase
{
public MyControl1()
{
InitializeComponent();
}
public override void DoOperation1()
{
return;
}
}
// MyControl1.xaml:
<UserControl x:Class="Test.Controls.BarChart"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid x:Name="LayoutRoot" Background="Blue">
</Grid>
</UserControl>
// mycontrol1.g.cs (generated by Visual Studio) orginally
public partial class MyControl1: System.Windows.Controls.UserControl
{
internal System.Windows.Controls.Grid LayoutRoot;
// InitilizeComponent() etc
}
// mycontrol1.g.cs (generated by Visual Studio) modified by me
public partial class MyControl1: MyControlBase
{
internal System.Windows.Controls.Grid LayoutRoot;
// InitilizeComponent() etc
}
При каждом редактировании MyControl1.xaml в редакторе Visual Studio 2008 после его сохранения измененный файл mycontrol1.g.cs продолжает возвращаться к исходному (именуемо: снова наследуется от System.Windows.Controls.UserControl). Затем компиляция завершается неудачно, потому что два частичных класса MyControl1 не наследуются от одного и того же родителя: сгенерированный VS наследует от System.Windows.Controls.UserControl, мой код от MyControlBase.
Есть ли способ обойти эту проблему? Я хотел бы иметь возможность наследовать от абстрактного класса и предположить, что Visual Studio может дать мне возможность, я просто не вижу, что мне не хватает. Или концепция UserControl, наследуемая от другого класса, отличного от System.Windows.Controls.UserControl, является плохой концепцией?