A 'Binding' can only be set on a DependencyProperty of a DependencyObject

后端 未结 6 1309
陌清茗
陌清茗 2020-12-03 02:39

From a custom control based on TextBox, I created a property named Items, in this way:

public class NewTextBox : TextBox
{
    publ         


        
相关标签:
6条回答
  • 2020-12-03 02:45

    As a side note, it is also worth noting that you will get these binding errors if you copy and paste between objects and forget to change the second typeof(Object) statement.

    I couldn't figure out for a good hour why I was getting this error as everything appeared to be defined and correct. I'd moved my properties into a usercontrol as I wanted to go from a single set to a list. Thus:

    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); }
    }
    

    Should have become:

    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); }
    }
    

    Until I did this change I kept receiving the 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.

    0 讨论(0)
  • 2020-12-03 02:47

    I had the (runtime + designtime) message:

    An unhandled exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll

    Additional information: A 'Binding' cannot be set on the 'Property' property of type 'Trigger'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.

    Where I was smart enough to define a Trigger on a VM property..

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

    Which should of course be a datatrigger (which uses Binding instead of Property)

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

    Triggers are typically for Controls (Button, TextBox, FrameworkElement etc.) properties.

    0 讨论(0)
  • 2020-12-03 03:03

    One thing I noticed, and I am not sure it is mentioned anywhere, is that the name of your DependencyProperty must match your property name

    If your property name is Items, then you DependencyProperty must be ItemsProperty

    In my case, as soon as I matched them the error went away

    0 讨论(0)
  • 2020-12-03 03:04

    To solve this exception you need to change the property Items and add a DependencyProperty that will work as a "link" in XAML. The class will be:

    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...
        }
    
    0 讨论(0)
  • 2020-12-03 03:06

    Here's another gotcha: Ensure that the string in the first argument of DependencyProperty.Register() matches the name of the related property.

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

    I ran into this issue when I renamed my property without changing the string.

    0 讨论(0)
  • 2020-12-03 03:07

    Another potential cause of this is when you provide a bad type for the default value in the metadata.
    For instance:

    new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)
    

    would throw this error if you wrote instead:

    new PropertyMetadata(false, OnItemsPropertyChanged)
    

    This can also happen if you are copying and pasting from a code source.

    0 讨论(0)
提交回复
热议问题