Un "Binding" ne peut être défini que sur une propriété Dependenced'un objet DependencyObject
à Partir d'un contrôle personnalisé basé sur TextBox
, j'ai créé une propriété nommée Items
de cette manière:
public class NewTextBox : TextBox
{
public ItemCollection Items { get; set; }
}
lors de L'utilisation du contrôle personnalisé dans XAML, Je ne peux pas lier la propriété car elle soulève l'exception "une 'liaison' ne peut être définie que sur une propriété DependencyObject.".
comment résoudre cette exception?
6 réponses
en tant que note secondaire, il est également intéressant de noter que vous obtiendrez ces erreurs de liaison Si vous copiez et collez entre les objets et oubliez de changer la seconde typeof(Object)
déclaration.
Je n'ai pas pu comprendre pendant une bonne heure pourquoi j'ai eu cette erreur car tout semblait être défini et correct. J'avais déplacé mes propriétés dans un usercontrol car je voulais passer d'un jeu simple à une liste. Donc:
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); }
}
aurait dû devenir:
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); }
}
Jusqu'à ce que j'ai fait ce changement je continuais à recevoir l'erreur:
A 'Binding' cannot be set on the property 'Folders' of type 'SavedFolderControl'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
pour résoudre cette exception, vous devez changer la propriété Items
DependencyProperty
cela fonctionnera comme un" lien " dans XAML. La classe sera:
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...
}
voici un autre gotcha: assurez-vous que la chaîne dans le premier argument de DependencyProperty.Register()
correspond au nom de la propriété.
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register(
"TheItems", // This is wrong
typeof(ItemCollection),
typeof(AutocompleteTextBox),
new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged));
j'ai rencontré ce problème quand j'ai renommé ma propriété sans changer la chaîne.
une Autre cause potentielle de cela est lorsque vous fournissez un mauvais type pour la valeur par défaut dans les métadonnées.
Par exemple:
new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)
lancer cette erreur si vous avez écrit à la place:
new PropertyMetadata(false, OnItemsPropertyChanged)
cela peut aussi se produire si vous copiez et collez à partir d'une source de code.
j'ai eu le message (runtime + designtime):
une exception non freinée du type 'Système.Windows.Balisage.XamlParseException " est survenue dans PresentationFramework.dll
Information Supplémentaire: un "Binding" ne peut pas être défini sur la "propriété" propriété de type "Trigger". Une "reliure" ne peut être définie que sur un DependencyProperty de DependencyObject.
où j'ai été assez intelligent pour définir un déclencheur sur une VM propriété..
// incorrect.. canont have Trigger for VM property
<Trigger Property="{Binding IsExpanded}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</Trigger>
qui devrait bien sûr être un datatrigger (qui utilise Binding au lieu de propriété)
<dataTrigger Binding="{Binding IsExpanded}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</Trigger>
les Triggers sont typiquement pour les contrôles (Bouton, TextBox, cadre, etc.) propriété.
vous avez juste besoin d'ajouter la propriété de dépendance ItemsProperty. Il suffit de googler les propriétés de dépendance WPF.