代码之家  ›  专栏  ›  技术社区  ›  Bryan Anderson

IEnumerable DependencyProperty在XAML中设置时引发错误

  •  0
  • Bryan Anderson  · 技术社区  · 14 年前

    我有一个自定义控件 Workspace Control 在它里面有一个 DependencyProperty 我需要包含一个指定的用户 IEnumerable<IFoo> (我也尝试过把它变成非通用的 IEnumerable ).

    Public Shared ReadOnly FoosProperty As DependencyProperty = DependencyProperty.Register("Foos", GetType(IEnumerable(Of IFoo)), GetType(Workspace), New FrameworkPropertyMetadata())
    Public Property Foos() As IEnumerable(Of IFoo)
        Get
            Return CType(Me.GetValue(FoosProperty), IEnumerable(Of IFoo))
        End Get
        Set(ByVal value As IEnumerable(Of IFoo))
            Me.SetValue(FoosProperty, CType(value, IEnumerable(Of IFoo)))
        End Set
    End Property
    

    当我创建并设置一组 IFoo 伊福 我得到了错误

    在运行时。如果我尝试添加多个 伊福 我在编译时遇到三个错误

    1. 对象“Workspace”已具有子级,无法添加“FooItem”工作区“”只能接受一个子项。
    2. 属性“Foos”不支持类型为“FooItem”的值。
    3. 属性“Foos”设置了多次。

    我认为这些错误意味着WPF没有像通常那样将xaml转换为项目数组。下面是我如何尝试在XAML中添加项

    <Workspace>
        <Workspace.Foos>
            <FooItem />
            <FooItem />
        </Workspace.Foos>
    </Workspace>
    

    我在过去创建过类似的DependencyProperties,从来没有遇到过问题,所以我猜我遗漏了一些简单的东西。

    谢谢你的帮助!

    1 回复  |  直到 14 年前
        1
  •  9
  •   repka    14 年前

    IList IDictionary IEnumerable XAML解析器尝试将第一个值赋给属性本身(而不是调用 Add

    另外,如果您想从XAML填充集合,请确保您的列表是实例化的,并且一开始不为null,因为XAML不会为您实例化列表,它只会调用 添加 在上面。所以要避免 NullReferenceException ,把你车上的塞特赶走 IList公司

    它不必是依赖属性:

    private readonly ObservableCollection<FooItem> _foos = new ObservableCollection<FooItem>();
    
    public ObservableCollection<FooItem> Foos
    {
        get { return _foos; }
    }