«Привязка» может быть установлена ​​только для свойства DependencyProperty объекта DependencyObject.

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

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

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

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


person mgottschild    schedule 11.07.2012    source источник
comment
да. Только свойства зависимостей могут выступать в качестве целей для привязок. Источник может быть свойством зависимости или свойством среды CLR, реализующим INotifyPropertyChanged.   -  person Gishu    schedule 11.07.2012
comment
Это точная копия вашего другого вопроса, где вы принимаете ответ и говорите, но мне пришлось изменить свойство, чтобы включить DependencyProperty. Ваше решение должно было быть включено в качестве ответа там   -  person arserbin3    schedule 11.07.2012
comment
@AdamHouldsworth: Да, этот вопрос был размещен только для того, чтобы опубликовать ответ. На самом деле это приветствуется, поскольку рассматривается как форма обмена знаниями, и даже существует новый CheckBox в форме" Задать вопрос ", который позволит вам написать ответ одновременно с вопросом.   -  person Rachel    schedule 11.07.2012
comment
@Rachel Достаточно честно, я этого не заметил, так как давно не задавал вопросов. В любом случае, я не проголосовал против вопроса или ответа, так что мои руки чистые :-)   -  person Adam Houldsworth    schedule 11.07.2012
comment
@ arserbin3 У Рэйчел правильное объяснение. И я решил опубликовать здесь вместо старого вопроса, поскольку я вижу проблему привязки как другой вопрос, чем исключение DependencyProperty.   -  person mgottschild    schedule 11.07.2012
comment
@Rachel, спасибо за объяснение - я тоже раньше не видел этого флажка   -  person arserbin3    schedule 11.07.2012


Ответы (7)


В качестве побочного примечания также стоит отметить, что вы получите эти ошибки привязки, если вы копируете и вставляете между объектами и забываете изменить второй оператор typeof(Object).

Я не мог понять в течение хорошего часа, почему я получаю эту ошибку, поскольку все выглядело определенным и правильным. Я переместил свои свойства в пользовательский элемент управления, так как хотел перейти от единственного набора к списку. Таким образом:

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.

person netniV    schedule 21.11.2013
comment
Этот. Я скопировал UserControl с некоторыми DependencyProperties, и это означает, что старое значение typeof(____)-Value все еще существует и действует. Я не получаю никаких ошибок до выполнения. И тогда XAML Parsing Exception A Binding может быть только установлен ... и так далее. Спасибо! - person ecth; 02.08.2016
comment
Он может существовать, но расставьте точки по типам, которые фактически соответствуют предлагаемым типам. - person netniV; 02.08.2016
comment
Нет, в том-то и дело. Я имел ввиду, что класс существует и действителен. Таким образом, вы не получите никаких ошибок в VS. Пока вы не скомпилируете и не запустите. Но тогда вы не знаете, откуда взялась ошибка! Это была моя ошибка после копирования .. - person ecth; 02.08.2016
comment
О да. Я тоже так поступил. Только вспыхнул в моей голове, когда я прочитал о копировании и вставке, чтобы тщательно проверить это, поскольку это то, что я сделал. - person netniV; 02.08.2016
comment
Спасибо, я думаю, вы только что сэкономили мне около часа! - person Avrohom Yisroel; 07.03.2019

Чтобы устранить это исключение, вам необходимо изменить свойство 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...
    }
person mgottschild    schedule 11.07.2012

Вот еще одна проблема: убедитесь, что строка в первом аргументе DependencyProperty.Register() совпадает с именем связанного свойства.

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

Я столкнулся с этой проблемой, когда переименовал свое свойство, не меняя строку.

person Oliver    schedule 12.09.2014
comment
Убедитесь, что имя - Items, а не ItemsProperty. - person Jeson Martajaya; 13.05.2015
comment
Вы можете использовать nameof (Items) в последних версиях .NET, чтобы избежать этой проблемы. - person Herman; 18.02.2016

Я заметил одну вещь (и я не уверен, что она нигде упоминается) заключается в том, что имя вашего DependencyProperty должно совпадать с именем вашего свойства.

Если имя вашего свойства - Items, тогда вашим DependencyProperty должно быть ItemsProperty

В моем случае, как только я сопоставил их, ошибка исчезла

person Pic Mickael    schedule 03.01.2020
comment
Ух ты. Не могу поверить, что это устранило предупреждение. Совершенно бессмысленно, но работает. Несмотря на то, что мои привязки работали во время выполнения, я продолжал видеть это предупреждение, пока не изменил имя переменной DependencyProperty на добавление Property. - person WSC; 29.10.2020

Другой потенциальной причиной этого является неправильный тип значения по умолчанию в метаданных.
Например:

new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)

выдаст эту ошибку, если вы напишете вместо этого:

new PropertyMetadata(false, OnItemsPropertyChanged)

Это также может произойти, если вы копируете и вставляете из источника кода.

person Prof Von Lemongargle    schedule 14.07.2014

У меня было сообщение (время выполнения + время разработки):

Необработанное исключение типа System.Windows.Markup.XamlParseException произошло в PresentationFramework.dll

Дополнительная информация: «Привязка» не может быть установлена ​​для свойства «Свойство» типа «Триггер». «Привязка» может быть установлена ​​только для DependencyProperty объекта DependencyObject.

Где я был достаточно умен, чтобы определить триггер для свойства виртуальной машины.

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

Который, конечно, должен быть триггером данных (который использует привязку вместо свойства)

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

Триггеры обычно используются для свойств элементов управления (Button, TextBox, FrameworkElement и т. Д.).

person EricG    schedule 28.11.2017

У меня возникла эта проблема из-за отсутствия контроля с моей стороны. я написал

<Button.Visibility>
   <MultiBinding Converter="{StaticResource mvbConverter}">
     <Binding Path="{Binding isActive}" />
     <Binding Path="{Binding isCashTransaction}" />
   </MultiBinding>
</Button.Visibility>

когда вместо этого я должен был написать

<Button.Visibility>
   <MultiBinding Converter="{StaticResource mvbConverter}">
     <Binding Path="isActive" />
     <Binding Path="isCashTransaction" />
   </MultiBinding>
</Button.Visibility>
person RamWill    schedule 01.01.2021