WPF Привязка к детской коллекции - PullRequest
0 голосов
/ 10 августа 2010

если у источника данных родителя есть дочернее свойство, которое является коллекцией (скажем, оно называется 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>

Мое свойство зависимостей выглядит так:

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;
}

Заранее благодарю за помощь.

Ответы [ 2 ]

0 голосов
/ 10 августа 2010

Ниже приведен рабочий пример с пользовательским элементом управления (ButtonList), который имеет DP типа IEnumerable<double> и создает кнопку для каждого двойного значения. Сравните это с вашим кодом, чтобы увидеть, что вы делаете неправильно.

XAML:

<UserControl x:Class="UserControlDemo.ButtonList"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:UserControlDemo="clr-namespace:UserControlDemo"
    Name="_buttonList">
    <ItemsControl ItemsSource="{Binding Path=Data, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControlDemo:ButtonList}}}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Content="{Binding}" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</UserControl>

Код позади:

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}" />
0 голосов
/ 10 августа 2010

Если я правильно понимаю ваш код, вы хотите, чтобы коллекция была в DataProperty UserControl.

Чтобы достичь этого, вы должны выполнить привязку следующим образом:

 <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 дочерним элементам. Вместо этого используйте панель (Grid / Stackpanel / WrapPanel).

Jan

...