Подтвердить что ты не робот

"Связывание" может быть установлено только на DependencyProperty объекта DependencyObject

В пользовательском элементе управления, основанном на TextBox, я создал свойство с именем Items следующим образом:

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

При использовании настраиваемого элемента управления в XAML я не могу связать свойство, потому что он вызывает исключение. "Связывание A" может быть установлено только в DependencyProperty объекта DependencyObject. ".

Как решить это исключение?

4b9b3361

Ответ 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 и т.д.).