O seguinte UserControl WPF chamado DataTypeWholeNumber que funciona.
Agora eu quero fazer um UserControl chamado DataTypeDateTime e DataTypeEmail , etc.
Muitas das propriedades de dependência serão compartilhadas por todos esses controles e, portanto, quero colocar seus métodos comuns em um BaseDataType e fazer com que cada um desses UserControls herde desse tipo base.
No entanto, quando faço isso, recebo o erro: Declaração parcial não pode ter classes base diferentes .
Então, como posso implementar herança com UserControls para que a funcionalidade compartilhada esteja toda na classe base?
using System.Windows;
using System.Windows.Controls;
namespace TestDependencyProperty827.DataTypes
{
public partial class DataTypeWholeNumber : BaseDataType
{
public DataTypeWholeNumber()
{
InitializeComponent();
DataContext = this;
//defaults
TheWidth = 200;
}
public string TheLabel
{
get
{
return (string)GetValue(TheLabelProperty);
}
set
{
SetValue(TheLabelProperty, value);
}
}
public static readonly DependencyProperty TheLabelProperty =
DependencyProperty.Register("TheLabel", typeof(string), typeof(BaseDataType),
new FrameworkPropertyMetadata());
public string TheContent
{
get
{
return (string)GetValue(TheContentProperty);
}
set
{
SetValue(TheContentProperty, value);
}
}
public static readonly DependencyProperty TheContentProperty =
DependencyProperty.Register("TheContent", typeof(string), typeof(BaseDataType),
new FrameworkPropertyMetadata());
public int TheWidth
{
get
{
return (int)GetValue(TheWidthProperty);
}
set
{
SetValue(TheWidthProperty, value);
}
}
public static readonly DependencyProperty TheWidthProperty =
DependencyProperty.Register("TheWidth", typeof(int), typeof(DataTypeWholeNumber),
new FrameworkPropertyMetadata());
}
}
c#
wpf
xaml
user-controls
Edward Tanguay
fonte
fonte
Respostas:
Certifique-se de ter alterado a primeira tag no xaml para herdar também de seu novo tipo de base
assim
torna-se
Portanto, para resumir a resposta completa, incluindo os detalhes extras dos comentários abaixo:
fonte
fonte
Encontrei a resposta neste artigo: http://www.paulstovell.com/xmlnsdefinition
Basicamente, o que se diz é que você deve definir um namespace XML no arquivo AssemlyInfo.cs, que pode ser usado no XAML. Funcionou para mim, no entanto, coloquei a classe de controle de usuário base em uma DLL separada ...
fonte
Eu tive o mesmo problema, mas precisava que o controle fosse herdado de uma classe abstrata, o que não é suportado pelo designer. O que resolveu meu problema é fazer o usercontrol herdar tanto de uma classe padrão (que herda UserControl) quanto de uma interface. Assim o designer está trabalhando.
fonte
Existe uma definição de classe parcial criada pelo designer, você pode abri-la facilmente através da definição do método InitializeComponent (). Em seguida, basta alterar a herança de classe parcial de UserControl para BaseDataType (ou qualquer outro especificado na definição de classe).
Depois disso, você receberá um aviso de que o método InitializeComponent () está oculto na classe filha.
Portanto, você pode fazer um CustomControl como classes base em vez de UserControl para evitar a definição parcial na classe base (conforme descrito em um comentário).
fonte