c# - Un ''Enlace'' solo se puede establecer en una DependencyProperty de un DependencyObject
wpf binding (6)
Aquí hay otro problema: asegúrese de que la cadena en el primer argumento de DependencyProperty.Register()
concuerde con el nombre de la propiedad relacionada.
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register(
"TheItems", // This is wrong
typeof(ItemCollection),
typeof(AutocompleteTextBox),
new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged));
Me encontré con este problema cuando cambié el nombre de mi propiedad sin cambiar la cadena.
Desde un control personalizado basado en TextBox
, creé una propiedad llamada Items
, de esta manera:
public class NewTextBox : TextBox
{
public ItemCollection Items { get; set; }
}
Cuando utilizo el control personalizado en XAML, no puedo enlazar la propiedad porque plantea la excepción "A ''Binding'' solo se puede establecer en DependencyProperty de DependencyObject".
¿Cómo resuelvo esta excepción?
Como nota al margen, también vale la pena señalar que obtendrá estos errores vinculantes si copia y pega entre los objetos y se olvida de cambiar el segundo tipo de declaración typeof(Object)
.
No pude averiguar durante una buena hora por qué estaba recibiendo este error ya que todo parecía estar definido y correcto. Había movido mis propiedades a un control de usuario porque quería pasar de un único conjunto a una lista. Así:
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); }
}
Debería haberse convertido en:
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); }
}
Hasta que hice este cambio, seguí recibiendo el error: A ''Binding'' cannot be set on the property ''Folders'' of type ''SavedFolderControl''. A ''Binding'' can only be set on a DependencyProperty of a DependencyObject.
A ''Binding'' cannot be set on the property ''Folders'' of type ''SavedFolderControl''. A ''Binding'' can only be set on a DependencyProperty of a DependencyObject.
Otra posible causa de esto es cuando proporciona un tipo incorrecto para el valor predeterminado en los metadatos.
Por ejemplo:
new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)
arrojaría este error si usted escribió en su lugar:
new PropertyMetadata(false, OnItemsPropertyChanged)
Esto también puede suceder si está copiando y pegando desde una fuente de código.
Para resolver esta excepción, debe cambiar los Items
propiedad y agregar una DependencyProperty
que funcionará como un "enlace" en XAML. La clase será:
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...
}
Solo necesita agregar la propiedad de dependencia ItemsProperty. Solo propiedades de dependencia de Google WPF.
Tenía el mensaje (runtime + designtime):
Se produjo una excepción no controlada del tipo ''System.Windows.Markup.XamlParseException'' en PresentationFramework.dll
Información adicional: no se puede establecer un ''Enlace'' en la propiedad ''Propiedad'' del tipo ''Disparador''. Un ''Enlace'' solo se puede establecer en una DependencyProperty de un DependencyObject.
Donde fui lo suficientemente inteligente como para definir un disparador en una propiedad de VM ...
// incorrect.. canont have Trigger for VM property
<Trigger Property="{Binding IsExpanded}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</Trigger>
Lo cual debería ser un datatrigger (que usa Binding en lugar de Property)
<dataTrigger Binding="{Binding IsExpanded}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</Trigger>
Los desencadenantes son típicamente para las propiedades de Control (Button, TextBox, FrameworkElement, etc.).