2012-07-11 19 views
31

Da un controllo personalizzato in base a TextBox, ho creato una proprietà denominata Items, in questo modo:A 'Binding' può essere impostato solo su un DependencyProperty di DependencyObject

public class NewTextBox : TextBox 
{ 
    public ItemCollection Items { get; set; } 
} 

Quando si utilizza il controllo personalizzato in XAML , Non posso associare la proprietà perché solleva un'eccezione "A 'Binding' può essere impostato solo su una DependencyProperty di DependencyObject.".

Come si risolve questa eccezione?

+2

Sì.Solo le proprietà di dipendenza possono fungere da target per i binding. L'origine può essere una proprietà di dipendenza o una proprietà CLR che implementa INotifyPropertyChanged – Gishu

+0

Questo è un duplicato esatto di un'altra domanda, in cui si accetta una risposta e si dice "ma ho dovuto modificare la proprietà per includere DependencyProperty". La tua soluzione avrebbe dovuto essere inclusa come risposta lì – arserbin3

+5

@AdamHouldsworth Sì, questa domanda è stata pubblicata solo per pubblicare la risposta. Questo è in realtà incoraggiato in quanto è visto come una forma di condivisione della conoscenza, e c'è anche un [nuovo 'CheckBox' nel modulo Domanda Ask] (http://meta.stackexchange.com/questions/132886/what-is- this-answer-your-own-question-jazz) che ti permetterà di scrivere una risposta nello stesso momento in cui scrivi la tua domanda. – Rachel

risposta

20

Per risolvere questa eccezione è necessario modificare la proprietà Items e aggiungere un DependencyProperty che funzionerà come un "collegamento" in XAML. La classe sarà:

public class AutocompleteTextBox : TextBox 
{ 
    public ItemCollection Items 
    { 
     get { 
      return (ItemCollection)GetValue(ItemsProperty); } 
     set { 
      SetValue(ItemsProperty, value); } 
    } 

    public static readonly DependencyProperty ItemsProperty = 
     DependencyProperty.Register(
      "Items", 
      typeof(ItemCollection), 
      typeof(AutocompleteTextBox), 
      new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)); 

    private static void OnItemsPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     // AutocompleteTextBox source = d as AutocompleteTextBox; 
     // Do something... 
    } 
53

Come nota a margine, è anche la pena notare che si ottengono questi errori vincolanti se si copia e incolla tra gli oggetti e dimenticare di modificare la seconda typeof(Object) dichiarazione.

Non riuscivo a capire per un'ora buona perché stavo ottenendo questo errore come tutto sembrava essere definito e corretto. Ho spostato le mie proprietà in un controllo utente perché volevo passare da un singolo set a un elenco. Così:

public static readonly DependencyProperty FoldersProperty = DependencyProperty.Register("Folders", typeof(OutlookFolders), typeof(MainWindow), new FrameworkPropertyMetadata(new OutlookFolders())); 

public OutlookFolders Folders 
{ 
    get { return GetValue(FoldersProperty) as OutlookFolders; } 
    set { SetValue(FoldersProperty, value); } 
} 

dovuto diventare:

public static readonly DependencyProperty FoldersProperty = DependencyProperty.Register("Folders", typeof(OutlookFolders), typeof(SavedFolderControl), new FrameworkPropertyMetadata(new OutlookFolders())); 

public OutlookFolders Folders 
{ 
    get { return GetValue(FoldersProperty) as OutlookFolders; } 
    set { SetValue(FoldersProperty, value); } 
} 

Fino a quando ho fatto questo cambiamento ho continuato a ricevere l'errore: A 'Binding' cannot be set on the property 'Folders' of type 'SavedFolderControl'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

+3

Questo. Ho copiato un UserControl con alcune DependencyProperties e ciò significa che il vecchio '' typeof (____) '' -Valore esiste ancora ed è valido. Non ricevo errori fino al runtime. E poi XAML Parsing Exception "A Binding può essere impostato solo ..." e così via. Grazie! – ecth

+0

Può esistere ma dot i tipi proposti proposti corrispondono effettivamente. – netniV

+0

No, questo è il punto. Intendevo che la classe esiste ed è valida. Quindi non avrai errori in VS. Finché non ti compili ed esegui. Ma poi non sai da dove viene l'errore! Quello era il mio mistyke dopo aver copiato .. – ecth

3

Un'altra causa potenziale di questo è quando si fornisce un cattivo tipo per il valore predefinito nei metadati.
Per esempio:

new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged) 

sarebbe gettare questo errore se hai scritto invece:

new PropertyMetadata(false, OnItemsPropertyChanged) 

Questo può succedere anche se si copia e incolla da un codice sorgente.

16

Ecco un altro trucco: Assicurarsi che la stringa nel primo argomento di DependencyProperty.Register() corrisponda al nome della proprietà correlata.

public static readonly DependencyProperty ItemsProperty = 
    DependencyProperty.Register(
     "TheItems", // This is wrong 
     typeof(ItemCollection), 
     typeof(AutocompleteTextBox), 
     new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)); 

Mi sono imbattuto in questo problema quando ho rinominato la mia proprietà senza cambiare la stringa.

+4

Assicurarsi che il nome sia "Articoli", non "ItemsProperty" –

+7

È possibile utilizzare il nome di (Elementi) nelle versioni .NET più recenti per evitare questo problema. – Herman

0

ho avuto il messaggio (runtime + designtime):

An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll

Additional information: A 'Binding' cannot be set on the 'Property' property of type 'Trigger'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

Dove ero abbastanza intelligente per definire un trigger su una proprietà VM ..

// incorrect.. canont have Trigger for VM property 
<Trigger Property="{Binding IsExpanded}" Value="True"> 
    <Setter Property="Visibility" Value="Visible"/> 
</Trigger> 

che dovrebbe naturalmente essere un DataTrigger (che utilizza Binding invece di proprietà)

<dataTrigger Binding="{Binding IsExpanded}" Value="True"> 
    <Setter Property="Visibility" Value="Visible"/> 
</Trigger> 

trigger sono in genere per il controllo di (Button, TextBox , FrameworkElement ecc.).

Problemi correlati