59

从基于 的自定义控件中,我以这种方式TextBox创建了一个名为 的属性:Items

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

在 XAML 中使用自定义控件时,我无法绑定该属性,因为它会引发异常“只能在 DependencyObject 的 DependencyProperty 上设置‘绑定’。”。

我该如何解决这个异常?

4

7 回答 7

109

作为旁注,还值得注意的是,如果您在对象之间复制和粘贴而忘记更改第二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.

于 2013-11-21T11:03:41.440 回答
30

要解决此异常,您需要更改属性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...
    }
于 2012-07-11T15:12:34.710 回答
27

这是另一个问题:确保第一个参数中的字符串DependencyProperty.Register()与相关属性的名称匹配。

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

当我在不更改字符串的情况下重命名我的属性时遇到了这个问题。

于 2014-09-12T10:27:42.477 回答
11

我注意到的一件事,我不确定它是否在任何地方被提及,是您的 DependencyProperty 的名称必须与您的属性名称匹配

如果您的属性名称是Items,那么您DependencyProperty 必须ItemsProperty

就我而言,一旦我匹配它们,错误就消失了

于 2020-01-03T19:57:30.000 回答
4

另一个可能的原因是您为元数据中的默认值提供了错误的类型。
例如:

new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)

如果您改为编写以下代码,则会引发此错误:

new PropertyMetadata(false, OnItemsPropertyChanged)

如果您从代码源复制和粘贴,也会发生这种情况。

于 2014-07-14T00:19:11.163 回答
1

由于我缺乏监督,我遇到了这个问题。我写

<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>
于 2021-01-01T14:25:14.157 回答
1

我收到了(运行时 + 设计时)消息:

PresentationFramework.dll 中出现“System.Windows.Markup.XamlParseException”类型的未处理异常

附加信息:不能在“触发器”类型的“属性”属性上设置“绑定”。只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。

我足够聪明地在 VM 属性上定义触发器的地方..

// 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>

触发器通常用于控件(按钮、文本框、框架元素等)属性。

于 2017-11-28T09:10:48.430 回答