Несколько пользовательских элементов управления совместно используют свойство зависимости коллекции

Я реализовал свой собственный пользовательский контроль на основе списков. Он имеет свойство зависимости с типом коллекции. Он отлично работает, когда у меня есть только один экземпляр пользовательского элемента управления в окне, но если у меня есть несколько экземпляров, у меня возникает проблема, связанная с тем, что они совместно используют свойство зависимости коллекции. Ниже приведен образец, иллюстрирующий это.

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

<UserControl x:Class="ItemsTest.SimpleList"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Name="_simpleList">
    <StackPanel>
        <TextBlock Text="{Binding Path=Title, ElementName=_simpleList}" />
        <ListBox 
            ItemsSource="{Binding Path=Numbers, ElementName=_simpleList}">
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
    </StackPanel>    
</UserControl>

Код позади:

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

namespace ItemsTest
{
    public partial class SimpleList : UserControl
    {
        public SimpleList()
        {
            InitializeComponent();
        }

        public string Title
        {
            get { return (string)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }

        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(SimpleList), new UIPropertyMetadata(""));


        public List<int> Numbers 
        {
            get { return (List<int> )GetValue(NumbersProperty); }
            set { SetValue(NumbersProperty, value); }
        }

        public static readonly DependencyProperty NumbersProperty =
            DependencyProperty.Register("Numbers ", typeof(List<int>), typeof(SimpleList), new UIPropertyMetadata(new List<int>()));
    }
}

Я использую так:

   <StackPanel>
        <ItemsTest:SimpleList Title="First">
            <ItemsTest:SimpleList.Numbers>
                <sys:Int32>1</sys:Int32>
                <sys:Int32>2</sys:Int32>
                <sys:Int32>3</sys:Int32>
            </ItemsTest:SimpleList.Numbers>
        </ItemsTest:SimpleList>
        <ItemsTest:SimpleList Title="Second">
            <ItemsTest:SimpleList.Numbers>
                <sys:Int32>4</sys:Int32>
                <sys:Int32>5</sys:Int32>
                <sys:Int32>6</sys:Int32>
            </ItemsTest:SimpleList.Numbers>
        </ItemsTest:SimpleList>
    </StackPanel>

Я ожидаю, что в моем окне появится следующее:

First
123
Second
456

Но то, что я вижу, это:

First
123456
Second
123456

Как заставить несколько SimpleList не делиться своей коллекцией номеров???


person Wallstreet Programmer    schedule 09.07.2010    source источник


Ответы (1)


Нашел ответ, конструктор должен инициализировать свойство, а не позволять статическому свойству делать себя:

public SimpleList()
{
   SetValue(NumbersProperty, new List<int>()); 

   InitializeComponent();
}

Свойства зависимости типа коллекции

person Wallstreet Programmer    schedule 09.07.2010
comment
Я не могу в это поверить. Я потратил несколько часов, не найдя ответа. Я вытащил все мои волосы. Спасибо :) Хотя я считаю, что это ошибка в механизме зависимости. - person Chen; 29.10.2015
comment
Это все еще проблема, но благодаря этому вопросу/ответу решение было безболезненным... - person PScr; 29.05.2016
comment
Все сводится к тому, как работают значения по умолчанию и DP типов ссылки: msdn.microsoft.com/en-us/library/aa970563%28v=vs.100%29.aspx - person PScr; 30.05.2016
comment
Вместо этого было бы лучше использовать SetCurrentValue, чтобы свойство по-прежнему можно было установить из Style. - person Grx70; 25.05.2018
comment
Это ДОЛЖНО быть более популярным вопросом! Это скандально! Я трачу почти 5 часов, пытаясь понять, ПОЧЕМУ мой элемент управления не работает должным образом..... - person GeorgiG; 16.07.2020