我有一个由我自己完成的usercontrol,它有一个依赖属性是一个集合:

    private static readonly DependencyPropertyKey VerticalLinesPropertyKey = DependencyProperty.RegisterReadOnly("VerticalLines", typeof(VerticalLineCollection), typeof(DailyChart), new FrameworkPropertyMetadata(new VerticalLineCollection()));
    public static DependencyProperty VerticalLinesProperty = VerticalLinesPropertyKey.DependencyProperty;


    public VerticalLineCollection VerticalLines
    {
        get
        {
            return (VerticalLineCollection)base.GetValue(VerticalLinesProperty);
        }
        set
        {
            base.SetValue(VerticalLinesProperty, value);
        }
    }

当Window使用控件时,我直接从XAML填充此集合,代码如下:

<chart:DailyChart.VerticalLines>
    <VerticalLine ... ... ... />
</chart:DailyChart.VerticalLines>

现在,我从XAML中删除了这个固定的初始化,我想将集合绑定到ViewModel的属性,但是我得到了错误:

Error   1   'VerticalLines' property cannot be data-bound.
Parameter name: dp

有任何想法吗?

===============>>#1 票数:2 已采纳

在您的XAML示例中,解析器看到VerticalLineCollection类型实现IList ,因此对于每个指定的VerticalLine将创建一个VerticalLine对象,然后在集合本身上调用Add

但是,当您尝试绑定集合时,语义变为“将新集合分配给VerticalLines属性”,这是无法完成的,因为这是一个只读的依赖项属性。 您的属性上的setter确实应该标记为私有,这样做会产生编译时错误。

希望这可以帮助!

===============>>#2 票数:0

我想这是因为(真正的只读依赖属性)

由于您只读了属性,因此可以将其更改为

        private static readonly DependencyPropertyKey VerticalLinesPropertyKey = DependencyProperty.Register("VerticalLines", typeof(VerticalLineCollection), typeof(DailyChart), new FrameworkPropertyMetadata(new VerticalLineCollection()));
        public static DependencyProperty VerticalLinesProperty = VerticalLinesPropertyKey.DependencyProperty;

反射器给出了答案:

    internal static BindingExpression CreateBindingExpression(DependencyObject d, DependencyProperty dp, Binding binding, BindingExpressionBase parent)
    {
        FrameworkPropertyMetadata fwMetaData = dp.GetMetadata(d.DependencyObjectType) as FrameworkPropertyMetadata;
        if (((fwMetaData != null) && !fwMetaData.IsDataBindingAllowed) || dp.ReadOnly)
        {
            throw new ArgumentException(System.Windows.SR.Get(System.Windows.SRID.PropertyNotBindable, new object[] { dp.Name }), "dp");
        }
        ....

希望这会奏效

  ask by Ignacio Soler Garcia translate from so

未解决问题?本站智能推荐:

1回复

数据绑定到LinkedList吗?

什么有效: 操纵内存中的LinkedList(字符串)的Web服务。 客户端可以插入/添加/删除/查询LinkedList的内容。 Web服务是从命令行启动的(无UI)。 我想做什么: 将命令行应用程序更改为WPF应用程序。 在WPF应用中,显
1回复

ObservableCollection作为DependencyProperty和绑定问题

我创建了一个Chart控件,过了一会儿,我决定向它添加多序列功能。 我使用ObservableCollection<ChartSerie>类型的依赖属性实现了该功能,如下所示: 我使用XAML中的此属性以这种方式调用它: ChartSerie代码只是ChartDat
2回复

以编程方式设置枚举绑定组合框的值

我正在使用: 将枚举属性数据绑定到WPF数据组合框中的ComboBox。 我无法以编程方式设置组合框的值。 一旦绑定,就无法设置SelectedItem,SelectedValue或Text。 一定有办法做到吗? 任何帮助表示赞赏。 为了澄清,我有一个绑定到具有所有50个状态的
3回复

WPF数据绑定Datagrid根据数据类型更改水平列方向

我试图根据数据类型(例如Int32,float,..)更改数据绑定DataGrid的水平列对齐方式。 在网上搜索了我已经了解的一个简单的例子,通过xaml的DataTriggers应该是正确的选择。 那正确吗? 如果是这样,我将如何实现触发器? 我是WPF的新手,过去一直在使用W
3回复

ListView,UserControl,DependencyProperty,ObservableCollection,INotifyPropertyChanged的绑定错误

我的绑定不起作用。 我搜索了错误,但我不明白如何在我的情况下解决它。 System.Windows.Data错误:1:无法创建默认转换器以在类型“MyApplication.MyUserControl”和“MyApplication.Person”之间执行“单向”转换。 考虑使用B
3回复

绑定到DependencyProperty没有结果

我有绑定到我的新控件的依赖属性的问题。 我决定写一些测试来检查这个问题。 从TextBox.Text绑定到另一个TextBox.Text XAML代码: 结果很好 - 当我在第一个TextBox中写东西时 - >第二个TextBox正在更新(反过来也是)。
1回复

将DataTrigger绑定到DependencyProperty

是否可以将数据触发绑定到元素的依赖属性,而无需使用“ ElementName”? 我有: 所以我想要这样的东西: 谢谢。
1回复

在样式中绑定DependencyProperty

我敢肯定,这是一件简单的事情,而且要查找,但是我还没有任何运气。 基本上,我想设置WPF滑块的样式,以便在使用时可以给它另外显示两个字符串。 新控件如下所示: 样式如下: 和用法: 这似乎不起作用。 那么,如何在控件上设置DP并将其显示在模板中? 我以为那是T
1回复

绑定到UserControl DependencyProperty

我创建了一个带有一些DependencyProperties的UserControl(在这个例子中只有一个字符串属性)。 当我实例化Usercontrol时,我可以设置UserControl的属性,并按预期显示。 当我尝试通过Binding替换静态文本时,不显示任何内容。 我的User
2回复

将ObservableCollection绑定到列表

我已经阅读了多个答案,但是根本无法解决问题。 我有一个从Web请求接收XML的程序,在其中我仅捕获XML中的特定属性。 当逐步执行时,我可以看到一切工作正常,检索将获取正确的XML,进行排序并获取正确的标签,然后将每个标签的内容分配给它们在另一个类中具有的关联变量。 另外,单步执行时,“