我创建了两个完全相同的自定义控件,除了它们有两种不同的类型。
ControlOne
public class ControlTwo : PasswordEdit
{
public static readonly DependencyProperty AwesomeSauceProperty =
DependencyProperty.Register("AwesomeSauce", typeof(string), typeof(FormTextEditInput));
public string AwesomeSauce
{
get { return GetValue(AwesomeSauceProperty) as string; }
set { SetValue(AwesomeSauceProperty, value); }
}
}
ControlTwo
<controls:ControlOne AwesomeSauce="Yummy"/>
<controls:ControlTwo AwesomeSauce="Tummy"/>
在XAML中我只是这样做
System.ArgumentException
'AwesomeSauce' property was already registered by 'ControlOne'.
我收到错误
.x1 { background: #fa0; }
您可能会问为什么我需要两个执行相同操作的控件,我可以创建数据模板并继续。但是我想要固执并说我需要不同类型的自定义控件来做同样的事情。如果我可以使用泛型类型的自定义控件,那会很好,但我发现这是不可能的(对吧?)。
我也不想使用不同的名称,因为这只是对问题的攻击。
我只是希望我的两个控件能够为其依赖项属性使用相同的名称。这里有什么我想念的吗?或者我只是不允许使用相同的名字?
我猜测附加属性将是解决方案,但我真的想推动自定义控件。
答案 0 :(得分:2)
ownerType
方法的第三个参数DependencyProperty.Register
必须是注册属性的类的类型,即您的案例中的ControlOne和ControlTwo:
public class ControlOne : TextEdit
{
public static readonly DependencyProperty AwesomeSauceProperty =
DependencyProperty.Register("AwesomeSauce", typeof(string), typeof(ControlOne));
...
}
public class ControlTwo : TextEdit
{
public static readonly DependencyProperty AwesomeSauceProperty =
DependencyProperty.Register("AwesomeSauce", typeof(string), typeof(ControlTwo));
...
}
答案 1 :(得分:1)
同样恰好发生在我身上,但只有一个UserControl:“Vista.xaml”在我的主窗口的几个标签页中多次创建。
我发现属性名称,变量名称和应用程序中的其他名称之间存在很多关系。
所以我必须避免跨xaml Style,Code Behind,vars,funcs等的名称冲突。这就解决了我的问题。
这是我的“MainWindow.xaml”中的控件
<local:Vista Margin="8,10,10,0" Titulo="Here goes title"/>
这是我的自定义控件“Vista”中的标签,显示属性“Titulo”设置的标题
Codigo:
<Label x:Name="labelTitulo" Content="{Binding ElementName=ControlVista,
Path=Titulo}" Style="{StaticResource estiloTituloVista}" />
//////////
这是属于UserControl代码隐藏“Vista.xaml.cs”的属性
enter code here
public static readonly DependencyProperty TituloProperty =
DependencyProperty.Register
(
"Titulo",
typeof(string),
typeof(Vista),
new FrameworkPropertyMetadata("")
);
public string Titulo
{
get { return (string)GetValue(TituloProperty); }
set { SetValue(TituloProperty, value); }
}
enter code here
在UserControl的主要类之前...
public Vista()
{
InitializeComponent();
if (Titulo != null && Titulo != "") { labelTitulo.Content = Titulo; }
}
您必须为UserControl命名,以便将属性分配给其中一个孩子。
在我的情况下,我将其命名为“ControlVista”
此名称与子标签控件“labelTitulo”的 Content 属性绑定