El siguiente UserControl de WPF llamado DataTypeWholeNumber que funciona.
Ahora quiero hacer un UserControl llamado DataTypeDateTime y DataTypeEmail , etc.
Muchas de las propiedades de dependencia serán compartidas por todos estos controles y, por lo tanto, quiero poner sus métodos comunes en un BaseDataType y que cada uno de estos UserControls herede de este tipo base.
Sin embargo, cuando hago eso, aparece el error: Es posible que la Declaración Parcial no tenga diferentes clases base .
Entonces, ¿cómo puedo implementar la herencia con UserControls para que la funcionalidad compartida esté en la clase 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
fuente
fuente
Respuestas:
Asegúrese de haber cambiado la primera etiqueta en el xaml para heredar también de su nuevo tipo base
Entonces
se convierte en
Entonces, para resumir la respuesta completa, incluidos los detalles adicionales de los comentarios a continuación:
fuente
fuente
Encontré la respuesta en este artículo: http://www.paulstovell.com/xmlnsdefinition
Básicamente, lo que dice es que debe definir un espacio de nombres XML en el archivo AssemlyInfo.cs, que puede usarse en el XAML. Funcionó para mí, sin embargo, coloqué la clase de control de usuario base en una DLL separada ...
fuente
Me encontré con el mismo problema, pero necesitaba que el control heredara de una clase abstracta, que no es compatible con el diseñador. Lo que resolvió mi problema es hacer que el control de usuario herede tanto de una clase estándar (que hereda UserControl) como de una interfaz. De esta forma trabaja el diseñador.
fuente
Hay una definición de clase parcial creada por el diseñador, puede abrirla de manera fácil a través de la definición del método InitializeComponent (). Luego, simplemente cambie la herencia de clase parcial de UserControl a BaseDataType (o cualquiera que haya especificado en la definición de clase).
Después de eso, tendrá una advertencia de que el método InitializeComponent () está oculto en la clase secundaria.
Por lo tanto, puede hacer un CustomControl como clase base en lugar de UserControl para evitar una definición parcial en la clase base (como se describe en un comentario).
fuente