"Связывание" может быть установлено только на DependencyProperty объекта DependencyObject
В пользовательском элементе управления, основанном на TextBox
, я создал свойство с именем Items
следующим образом:
public class NewTextBox : TextBox
{
public ItemCollection Items { get; set; }
}
При использовании настраиваемого элемента управления в XAML я не могу связать свойство, потому что он вызывает исключение. "Связывание A" может быть установлено только в DependencyProperty объекта DependencyObject. ".
Как решить это исключение?
Ответы
Ответ 1
В качестве побочного примечания также стоит отметить, что вы получите эти ошибки привязки, если вы скопируете и вставьте между объектами и забудьте изменить второй оператор typeof(Object)
.
Я не мог понять, на какой час я получил эту ошибку, поскольку все, казалось, было определено и правильно. Я переместил свои свойства в usercontrol, поскольку я хотел перейти из одного набора в список. Таким образом:
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); }
}
Должно стать:
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); }
}
Пока я не сделал это изменение, я все время получал ошибку:
A 'Binding' cannot be set on the property 'Folders' of type 'SavedFolderControl'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
Ответ 2
Чтобы решить это исключение, вам нужно изменить свойство Items
и добавить DependencyProperty
, который будет работать как "ссылка" в XAML. Класс будет:
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...
}
Ответ 3
Здесь еще раз: Убедитесь, что строка в первом аргументе DependencyProperty.Register()
соответствует имени связанного свойства.
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register(
"TheItems", // This is wrong
typeof(ItemCollection),
typeof(AutocompleteTextBox),
new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged));
Я столкнулся с этой проблемой, когда переименовал свое свойство без изменения строки.
Ответ 4
Другая потенциальная причина этого - когда вы указываете плохой тип для значения по умолчанию в метаданных.
Например:
new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)
выбрасывает эту ошибку, если вы написали:
new PropertyMetadata(false, OnItemsPropertyChanged)
Это также может произойти, если вы копируете и вставляете исходный код.
Ответ 5
У меня было сообщение (runtime + designtime):
Необработанное исключение типа 'System.Windows.Markup.XamlParseException' произошло в PresentationFramework.dll
Дополнительная информация: "Связывание" не может быть установлено в "Свойстве", свойство типа "Триггер". "Связывание" может быть установлено только на DependencyProperty объекта DependencyObject.
Где я был достаточно умен, чтобы определить Trigger для свойства VM.
// incorrect.. canont have Trigger for VM property
<Trigger Property="{Binding IsExpanded}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</Trigger>
Который должен, конечно, быть datatrigger (который использует Binding вместо свойства)
<dataTrigger Binding="{Binding IsExpanded}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</Trigger>
Триггеры обычно относятся к свойствам Control (Button, TextBox, FrameworkElement и т.д.).