从基于 的自定义控件中,我以这种方式TextBox
创建了一个名为 的属性:Items
public class NewTextBox : TextBox
{
public ItemCollection Items { get; set; }
}
在 XAML 中使用自定义控件时,我无法绑定该属性,因为它会引发异常“只能在 DependencyObject 的 DependencyProperty 上设置‘绑定’。”。
我该如何解决这个异常?
从基于 的自定义控件中,我以这种方式TextBox
创建了一个名为 的属性:Items
public class NewTextBox : TextBox
{
public ItemCollection Items { get; set; }
}
在 XAML 中使用自定义控件时,我无法绑定该属性,因为它会引发异常“只能在 DependencyObject 的 DependencyProperty 上设置‘绑定’。”。
我该如何解决这个异常?
作为旁注,还值得注意的是,如果您在对象之间复制和粘贴而忘记更改第二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.
要解决此异常,您需要更改属性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...
}
这是另一个问题:确保第一个参数中的字符串DependencyProperty.Register()
与相关属性的名称匹配。
public static readonly DependencyProperty ItemsProperty =
DependencyProperty.Register(
"TheItems", // This is wrong
typeof(ItemCollection),
typeof(AutocompleteTextBox),
new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged));
当我在不更改字符串的情况下重命名我的属性时遇到了这个问题。
我注意到的一件事,我不确定它是否在任何地方被提及,是您的 DependencyProperty 的名称必须与您的属性名称匹配
如果您的属性名称是Items,那么您DependencyProperty 必须是ItemsProperty
就我而言,一旦我匹配它们,错误就消失了
另一个可能的原因是您为元数据中的默认值提供了错误的类型。
例如:
new PropertyMetadata(default(ItemCollection), OnItemsPropertyChanged)
如果您改为编写以下代码,则会引发此错误:
new PropertyMetadata(false, OnItemsPropertyChanged)
如果您从代码源复制和粘贴,也会发生这种情况。
由于我缺乏监督,我遇到了这个问题。我写
<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>
我收到了(运行时 + 设计时)消息:
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>
触发器通常用于控件(按钮、文本框、框架元素等)属性。