WPF绑定到子集合

WPF绑定到子集合,wpf,data-binding,collections,Wpf,Data Binding,Collections,如果父数据源的子属性是一个集合,比如说它被称为ChildCollection,那么引用它有什么技巧吗 所以,这个代码示例基本上就是我要做的。但是,当我使用这种方法时,我不会向我的子控件获取任何数据 <UserControl> <UserControl.Resources> <sample:Data x:Key="MyData" /> </UserControl.Resources> <Canvas Da

如果父数据源的子属性是一个集合,比如说它被称为ChildCollection,那么引用它有什么技巧吗

所以,这个代码示例基本上就是我要做的。但是,当我使用这种方法时,我不会向我的子控件获取任何数据

<UserControl>
    <UserControl.Resources>
        <sample:Data x:Key="MyData" />
    </UserControl.Resources>
    <Canvas DataContext="{StaticResource MyData}">
        <TextBlock Text="{Binding Title}" />
        <My:UserControl DataContext="{Binding ChildCollection}" />
    </Canvas>
</UserControl>

提前感谢您的帮助。

如果我正确理解您的代码,您希望集合位于UserControl的DataProperty中

要实现这一点,必须按如下方式进行绑定:

public static readonly DependencyProperty DataProperty =
    DependencyProperty.Register("Data", typeof(IEnumerable), typeof(ButtonList), 
    new UIPropertyMetadata(new PropertyChangedCallback(DataChanged)));
public DoubleCollection Data
{
    get { return (DoubleCollection)GetValue(DataProperty); }
    set { SetValue(DataProperty, value); }
}
static void DataChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
    (sender as FrameworkElement).DataContext = e.NewValue;
}
public void SetData(IEnumerable data)
{
    (View as CollectionViewSource).Source = data;
}
 <Canvas DataContext="{StaticResource MyData}">
    <TextBlock Text="{Binding Title}" />
    <My:UserControl Data="{Binding ChildCollection}" />
 </Canvas>
而不是:

<Canvas DataContext="{StaticResource MyData}">
    <TextBlock Text="{Binding Title}" />
    <My:UserControl DataContext="{Binding ChildCollection}" />
 </Canvas>
希望这是有帮助的。另外:我不知道画布是否将其DataContext继承给childs。使用面板代替网格/堆栈面板/包装面板


Jan

下面是一个带有用户控件按钮列表的工作示例,该列表的DP类型为IEnumerable,并为每个双精度值创建一个按钮。将其与您的代码进行比较,以查看您的错误操作

XAML:

代码隐藏:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;

namespace UserControlDemo
{
    public partial class ButtonList : UserControl
    {
        public ButtonList()
        {
            InitializeComponent();
        }

        public IEnumerable<double> Data
        {
            get { return (IEnumerable<double>)GetValue(DataProperty); }
            set { SetValue(DataProperty, value); }
        }

        public static readonly DependencyProperty DataProperty =
            DependencyProperty.Register("Data",
                                        typeof(IEnumerable<double>), 
                                        typeof(ButtonList), 
                                        new UIPropertyMetadata(new List<double>()));
    }
}
用法:

 <UserControlDemo:ButtonList Data="{Binding Path=Numbers}" />

另外,请尝试在面板上为DataContext绑定使用DynamicSource而不是StaticResource。画布是从面板派生的。所有框架元素都提供DataContext继承。这是不对的。框架组件不继承其DataContext。因为我没有用Canvas测试它,所以我提到了它。
 <UserControlDemo:ButtonList Data="{Binding Path=Numbers}" />