Привязка значений подпунктов коллекции - PullRequest
0 голосов
/ 20 октября 2011

Посмотрите на этот пример:

Я создал собственный элемент управления с коллекцией в качестве свойства зависимости и заполнил элементы коллекции подпунктами, получая значения из привязки.Если я создаю подэлементы с фиксированными значениями, все работает, если я связываю их значения, я получаю ошибки связывания.

Это пользовательский элемент управления со свойством зависимости только для чтения:

public partial class UserControl1 : UserControl
{
    private static DependencyPropertyKey TextsPropertyKey = DependencyProperty.RegisterReadOnly("Texts", typeof(ItemCollection), typeof(UserControl1), new FrameworkPropertyMetadata(new ItemCollection()));
    public static DependencyProperty TextsProperty = TextsPropertyKey.DependencyProperty;

    public ItemCollection Texts
    {
        get
        {
            return (ItemCollection)GetValue(TextsProperty);
        }
        set
        {
            SetValue(TextsProperty, value);
        }
    }

    public UserControl1()
    {
        ItemCollection texts = new ItemCollection();
        SetValue(TextsPropertyKey, texts);
        InitializeComponent();
    }
}

ЭтоWindow XAML:

<Window x:Class="ControlList.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ControlList="clr-namespace:ControlList"
Title="Window1" Height="300" Width="300">
<Grid>
    <ControlList:UserControl1>
        <ControlList:UserControl1.Texts>
            <ControlList:ItemOfTheList Text="{Binding Text1}"></ControlList:ItemOfTheList>
            <ControlList:ItemOfTheList Text="{Binding Text2}"></ControlList:ItemOfTheList>
        </ControlList:UserControl1.Texts>
    </ControlList:UserControl1>
</Grid>
</Window>

Класс ItemOfTheList - это просто объект со строковым свойством Dependency:

public class ItemOfTheList : DependencyObject
{
    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(ItemOfTheList));

    public string Text
    {
        get
        {
            return (string)GetValue(TextProperty);
        }
        set
        {
            SetValue(TextProperty, value);
        }
    }

    public override string ToString()
    {
        return this.Text;
    }
}

А коллекция элементов - это просто не универсальная FreezableCollection:

public class ItemCollection : FreezableCollection<ItemOfTheList>
{
}

Таким образом я получаю следующие ошибки:

System.Windows.Data Ошибка: 2: Не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента.BindingExpression: Path = Text1;DataItem = NULL;целевым элементом является ItemOfTheList (HashCode = 52697953);Свойство target - «Текст» (тип «String»). System.Windows.Data Ошибка: 2: Не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента.BindingExpression: Path = Text2;DataItem = NULL;целевым элементом является ItemOfTheList (HashCode = 22597652);Свойство target имеет значение «Text» (тип «String»)

. Если я изменяю ItemOfTheList на FrameworkElement, я всегда получаю в окне вывода, что DataContext равен нулю.Как я могу унаследовать текст данных от UserControl в ItemOfTheList объектах?

1 Ответ

1 голос
/ 20 октября 2011

Ваши дочерние элементы не являются частью логического дерева, поэтому не могут участвовать в привязках.Пожалуйста, смотрите мое сообщение в блоге здесь для получения подробной информации о том, как исправить это.

...