Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF Странный глюк с зависимым свойством-коллекцией / 6 сообщений из 6, страница 1 из 1
28.09.2014, 09:04
    #38759726
beowulf_21_x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Странный глюк с зависимым свойством-коллекцией
Сделал UserControl там зависимое свойство-коллекция. На форме разместил несколько таких контролов с разными параметрами. Но почему-то каждый из этих контролов видит это свойство не как набор всех элементов заданных внутри него, а как конкатенацию коллекций, заданных для всех контролов, размещенных на форме.
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<my1:CommonCtrlKirishi Rows="22" Floors="12">
                <my1:CommonCtrlKirishi.PointsEmptyLeft>
                    <my1:GridPoint X="0" Y="0" />
                    <my1:GridPoint X="0" Y="1" />
                    ...
                    <my1:GridPoint X="0" Y="10" />                    
                </my1:CommonCtrlKirishi.PointsEmptyLeft>
 
 
            </my1:CommonCtrlKirishi>
        </TabItem>
        <TabItem Header="Штабелер 2">
 
            <my1:CommonCtrlKirishi StackerID="2" Rows="22" Floors="12">
 
                <my1:CommonCtrlKirishi.PointsEmptyLeft>
                    <my1:GridPoint X="0" Y="0" />
                    <my1:GridPoint X="0" Y="1" />
                    ...
                    <my1:GridPoint X="0" Y="9" />
                    <my1:GridPoint X="0" Y="10" />
                    <my1:GridPoint X="0" Y="11" />
                </my1:CommonCtrlKirishi.PointsEmptyLeft>
                <my1:CommonCtrlKirishi.PointsEmptyRight>                   
                    <my1:GridPoint X="0" Y="1" />
                    <my1:GridPoint X="0" Y="2" />
                    ...
                    <my1:GridPoint X="0" Y="10" />
                    <my1:GridPoint X="0" Y="11" />
                </my1:CommonCtrlKirishi.PointsEmptyRight>
            </my1:CommonCtrlKirishi>


Код свойства контрола:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
// Dependency Property
        public static readonly DependencyProperty PointsEmptyLeftDP = DependencyProperty.Register("PointsEmptyLeft", typeof(ObservableCollection<GridPoint>), typeof(StackerControl), new FrameworkPropertyMetadata(new ObservableCollection<GridPoint>(),DepParamsChanged));
        // .NET Property wrapper
        [Description("Free points in left rack"), Category("Stacker")]
        public ObservableCollection<GridPoint> PointsEmptyLeft
        {
            get
            {
                return (ObservableCollection<GridPoint>)GetValue(PointsEmptyLeftDP);
            }
            set
            {
                SetValue(PointsEmptyLeftDP, value);
 
            }
        }
 
        // Dependency Property
        public static readonly DependencyProperty PointsEmptyRightDP = DependencyProperty.Register("PointsEmptyRight", typeof(ItemsChangeObservableCollection<GridPoint>), typeof(StackerControl), new FrameworkPropertyMetadata(new ItemsChangeObservableCollection<GridPoint>(), DepParamsChanged));
        // .NET Property wrapper
        [Description("Free points in right rack"), Category("Stacker")]
        public ItemsChangeObservableCollection<GridPoint> PointsEmptyRight
        {
            get
            {
                return (ItemsChangeObservableCollection<GridPoint>)GetValue(PointsEmptyRightDP);
            }
            set
            {
                SetValue(PointsEmptyRightDP, value);
 
            }
        }
 
 public void SetParam(String propname, Object val, object oldval)
        {
            switch (propname)
            {
               ...
                case "PointsEmptyLeft":
                    restruct_left();
                    set_cell_styles();
                    break;
                case "PointsEmptyRight":
                    restruct_right();
                    set_cell_styles();
                    break;
            }
        }
 
        private static void DepParamsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            StackerControl ctrl = (StackerControl)d;
 
            ctrl.SetParam(e.Property.Name, e.NewValue, e.OldValue);
 
        }
...
Рейтинг: 0 / 0
28.09.2014, 17:11
    #38759877
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Странный глюк с зависимым свойством-коллекцией
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public static readonly DependencyProperty PointsEmptyRightDP = 
    DependencyProperty.Register(
        "PointsEmptyRight", 
        typeof(ItemsChangeObservableCollection<GridPoint>), 
        typeof(StackerControl), 
        new FrameworkPropertyMetadata(
            new ItemsChangeObservableCollection<GridPoint>(), // <== это
            DepParamsChanged
        )
    );

Потому что Default Value одно для всех свойств данного типа.
...
Рейтинг: 0 / 0
29.09.2014, 17:32
    #38761010
beowulf_21_x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Странный глюк с зависимым свойством-коллекцией
Алексей К,

И что теперь делать? Нет, ну я же ведь не написал там ссылку на переменную, которая уже инициализированна этим конструктором. Тогда я бы понял. Но это же вроде абсолютно разные области в памяти, чего общего у них?
...
Рейтинг: 0 / 0
30.09.2014, 08:36
    #38761467
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Странный глюк с зависимым свойством-коллекцией
инициализация свойства "по умолчанию" происходит 1 раз. Нужно в свойстве "по умолчанию" указать "Null"
...
Рейтинг: 0 / 0
30.09.2014, 08:59
    #38761482
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Странный глюк с зависимым свойством-коллекцией
не забудьте в конструкторе класса UserControl'а создать объект коллекции для этого свойства через
SetValue(PointsEmptyRightDP, new ItemsChangeObservableCollection<GridPoint>());
и вроде как свойства зависимости принято заканчивать на Property, а не на DP
...
Рейтинг: 0 / 0
30.09.2014, 10:47
    #38761618
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WPF Странный глюк с зависимым свойством-коллекцией
beowulf_21_xАлексей К,

И что теперь делать? Нет, ну я же ведь не написал там ссылку на переменную, которая уже инициализированна этим конструктором. Тогда я бы понял. Но это же вроде абсолютно разные области в памяти, чего общего у них?Зачем тебе тут DependencyProperty? Делай обычное свойство. Смотри как сделано свойство ItemsControl.Items .
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / WPF Странный глюк с зависимым свойством-коллекцией / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]