【问题标题】:WPF: Collection dependency property "is read-only and cannot be set from markup"WPF:集合依赖属性“是只读的,不能从标记中设置”
【发布时间】:2010-01-27 14:44:13
【问题描述】:

我正在创建一个用户控件来显示三个月的日历。该控件基于 WPF 日历控件 (WPF Toolkit 2009-06),我想将日历的几个属性传递给我的用户控件的相应属性。用户控件属性设置为依赖属性,其基础类型与日历属性的类型相匹配。这是我的标记:

<StackPanel>
    <toolkit:Calendar Name="MasterCalendar" 
        SelectionMode="{Binding Path=SelectionMode, Mode=OneWay}"
        SelectedDate="{Binding Path=SelectedDate, Mode=OneWayToSource}"
        SelectedDates="{Binding Path=SelectedDates, Mode=OneWayToSource}"/>
    <toolkit:Calendar Name="SlaveCalendar1" 
        DisplayDate="{Binding DisplayDate, Converter={StaticResource IncrementalMonthConverter}, ElementName=MasterCalendar, Mode=OneWay}"
        SelectionMode="{Binding Path=SelectionMode, Mode=OneWay}"
        SelectedDate="{Binding Path=SelectedDate, Mode=OneWayToSource}"
        SelectedDates="{Binding Path=SelectedDates, Mode=OneWayToSource}"/>
    <toolkit:Calendar Name="SlaveCalendar2" 
        DisplayDate="{Binding DisplayDate, Converter={StaticResource IncrementalMonthConverter}, ElementName=SlaveCalendar1, Mode=OneWay}"
        SelectionMode="{Binding Path=SelectionMode, Mode=OneWay}"
        SelectedDate="{Binding Path=SelectedDate, Mode=OneWayToSource}"
        SelectedDates="{Binding Path=SelectedDates, Mode=OneWayToSource}"/>
</StackPanel>

除了SelectedDates 属性之外,所有属性都可以毫无问题地绑定。我在绑定时收到以下错误:

'SelectedDates' 属性是只读的,不能从标记中设置。

我怀疑这是因为SelectedDates 属性是一个集合,但我不知道如何解决这个问题。任何人都可以告诉我问题的原因并提出解决方案吗?谢谢你的帮助。

【问题讨论】:

    标签: wpf wpf-controls dependency-properties readonly


    【解决方案1】:

    如果我对您的理解很好,您的代码中有 Dependency 属性,名称匹配,并在您的用户控件中键入日历控件的属性。您正在尝试将各种日历控件的 SelectedDates 集合分配给后面代码中同名的 Dependency 属性。

    你可以通过一行代码简单地做到这一点:

    this.SelectedDates=SlaveCalendar1.SelectedDates

    在添加选定日期时触发的适当事件处理程序中。

    即使您将绑定设置为OneWayToSourceSelectedDates= 代码段也是一个赋值。由于 SelectedDates 属性没有设置器,因此无法编写这段代码。

    Here你可以找到日历控件文档的链接

    【讨论】:

    • 这是我感到困惑的地方:如果我将值从 SlaveCalendar1 传递给我的用户控件属性,我只会读取 SlaveCalendar1.SelectedDates;我正在写信给我用 setter 定义的 MyUserControl.SelectedDates。换句话说, MyUserControl.SelectedDates 不是只读的,这就是我要写的。为什么这不起作用?
    • 您如何将 SlaveCalendar1.SelectedDates 传递给 this.SelectedDates?我了解您是通过将绑定模式设置为 OneWayToSource 来实现的。不过,这行代码似乎仍被解释为赋值,为此您需要一个 setter。有很多解决方法!
    • 所以,如果我理解正确的话,我无法绑定只读属性,即使绑定的是 OneWayToSource;也就是说,一个只从只读属性中读取的绑定?谢谢
    猜你喜欢
    • 1970-01-01
    • 2010-12-17
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多