2016-04-08 6 views
1

Ich habe zwei benutzerdefinierte Steuerelemente erstellt, die genau dieselben sind, mit der Ausnahme, dass sie zwei unterschiedliche Typen aufweisen.WPF: Die benutzerdefinierte Steuereigenschaft wurde bereits von einem anderen benutzerdefinierten Steuerfehler registriert

ControlOne

public class ControlOne : TextEdit 
    { 
     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

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

     } 

Und in XAML ich einfach tun, um diese

<controls:ControlOne AwesomeSauce="Yummy"/> 
<controls:ControlTwo AwesomeSauce="Tummy"/> 

und ich bekomme Fehler

System.ArgumentException 
'AwesomeSauce' property was already registered by 'ControlOne'. 

Sie fragen vielleicht, warum ich zwei Steuerelemente brauche, die die gleichen Dinge tun, ich kann einfach Datenvorlagen erstellen und weitermachen. Aber ich möchte stur sein und sagen, dass ich benutzerdefinierte Steuerelemente verschiedener Typen brauche, die dasselbe tun. Es wäre schön, wenn ich benutzerdefinierte Steuerelemente eines generischen Typs verwenden könnte, aber ich fand heraus, dass das nicht möglich ist (richtig?).

Ich möchte auch nicht andere Namen verwenden, weil das nur ein Hack für das Problem wäre.

Ich möchte nur, dass meine zwei Steuerelemente die gleichen Namen für ihre Abhängigkeitseigenschaften verwenden können. Gibt es etwas, das mir hier fehlt? oder bin ich gerade dabei, nicht die gleichen Namen zu verwenden?

Ich vermute, dass angefügte Eigenschaften die Lösung dafür sein würden, aber ich möchte wirklich für ein benutzerdefiniertes Steuerelement drücken.

Antwort

1

Der dritte Parameter ownerType der DependencyProperty.Register Methode muss der Typ der Klasse sein, die die Eigenschaft, das heißt ControlOne und ControlTwo in Ihrem Fall registriert:

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)); 
    ... 
} 
+0

schön ist verbindlich! Ich weiß nicht, wie ich es verpasst habe. –

1

gleiche passiert einfach zu mir, aber mit nur einem Benutzersteuerelement : "Vista.xaml", das mehrfach in mehreren Registerkarten meines Hauptfensters erstellt wird.

Ich entdecke, dass es viele Beziehungen zwischen dem Namen der Eigenschaft, dem Namen der Variablen und den anderen Namen in der App gibt.

So muss ich Namenskollisionen über XAML-Stil, Code hinter, VARS, Funcs, etc. vermeiden und das Problem für mich lösen.

das ist die Kontrolle in meinem "MainWindow.xaml"

<local:Vista Margin="8,10,10,0" Titulo="Here goes title"/> 

dies ist das Label in meinem Custom Control "Vista", die den Titel von der Unterkunft "Titulo"

Codigo: 

    <Label x:Name="labelTitulo" Content="{Binding ElementName=ControlVista, 
    Path=Titulo}" Style="{StaticResource estiloTituloVista}" /> 

////////// 
gesetzt zeigen

Hier ist die Eigenschaft, die sich in UserControl-Code-Behind "Vista.xaml" befindet.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 

die kurz vor der Hauptklasse Ihres Usercontrol

public Vista() 
 
    { 
 
     InitializeComponent(); 
 

 
     if (Titulo != null && Titulo != "") { labelTitulo.Content = Titulo; } 
 
      
 
    }

Sie Ihr Benutzersteuerelement, um eine Immobilie zuweisen eines Childs davon ist geht haben zu nennen. In meinem Fall nannte ich es "ControlVista"

Dieser Name mit der Inhalt Eigenschaft der Kinder Label control "labelTitulo"

View of Vista.xaml design mode

This is how it looks in the mainwindow.xaml