WPF:自定义控件属性已由另一个自定义控件错误注册

时间:2016-04-08 15:23:33

标签: wpf xaml wpf-controls

我创建了两个完全相同的自定义控件,除了它们有两种不同的类型。

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; }

您可能会问为什么我需要两个执行相同操作的控件,我可以创建数据模板并继续。但是我想要固执并说我需要不同类型的自定义控件来做同样的事情。如果我可以使用泛型类型的自定义控件,那会很好,但我发现这是不可能的(对吧?)。

我也不想使用不同的名称,因为这只是对问题的攻击。

我只是希望我的两个控件能够为其依赖项属性使用相同的名称。这里有什么我想念的吗?或者我只是不允许使用相同的名字?

我猜测附加属性将是解决方案,但我真的想推动自定义控件。

2 个答案:

答案 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 属性绑定

View of Vista.xaml design mode

This is how it looks in the mainwindow.xaml