powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding и UserControl
17 сообщений из 42, страница 2 из 2
Binding и UserControl
    #37699613
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

Я может не совсем коректно выразился)))
У него в коде в качестве свойства зависимости объявляется TheWidthHeight.

public static readonly DependencyProperty TheWidthHeightProperty =
DependencyProperty.Register("TheWidthHeight", typeof(WidthHeight), typeof(RedRectangel), new UIPropertyMetadata(null, OnTheWidthHeightPropertyChanged));

В методе Register второй параметр typeof(WidthHeight). Знчит в классе WidthHeight должно быть объявлено свойство TheWidthHeight.

Теперь смотрим содержимое класса WidthHeight. Я в нем не увидел объявленное свойство TheWidthHeight. Из всех свойств класса WidthHeight которые у него объявлены я вижу только:

MirrorWidthHeight
Width
Height

Далее в коде у него TheWidthHeight="{Binding ElementName=TheControl, Path=TestWidthHeight.MirrorWidthHeight, Mode=TwoWay}". Поэтому не удивительно что не работает
...
Рейтинг: 0 / 0
Binding и UserControl
    #37699642
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

Просьба не набрасываться на меня. У меня есть оправдание - голова не совсем уже работает))). Я понимаю что в предыдущем посте чушь написал))
...
Рейтинг: 0 / 0
Binding и UserControl
    #37699674
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

В общем исправляю свой косяк.

Под вечер тяжеловато уже думается - особенно в воскр.
В общем при регистрации свойств зависмостей он использует следующее:

new UIPropertyMetadata - Предоставляет метаданные свойств для несистемных свойств, которые влияют на отрисовку или пользовательский интерфейс на уровне ядра.
Я не могу утверждать (так как явно этого не нашел). Но есть подозрение, что вызываемый метод при изменении свойства зависимости не будет влиять на на компоновку элементов в панели.

Далее смотрим на популярный метод при регистрации свойств зависимостей:

public class FrameworkPropertyMetadata : UIPropertyMetadata

То FrameworkPropertyMetadata наследуется от нашего уже небезызвестного UIPropertyMetadata.
НО.. при использовании FrameworkPropertyMetadata у него есть такая штука, как FrameworkPropertyMetadataOptions, которая имеет специальные флаги, которые майкрософт просит нас использовать, если мы изменяем свойства зависимостей, которые изменяют размеры эелементов. Даже если порыть в инете, можно увидеть, что если используются пользовательские свойства для изменения компоновки эелементов в панели, то как правило используются фалги типа AffectMesuare (как то так называется). То есть все должно выглядеть как то типа этого:

public static readonly DependencyProperty TheWidthHeightProperty =
DependencyProperty.Register("TheWidthHeight", typeof(WidthHeight), typeof(RedRectangel), new FrameworkPropertyMetadata(50, FrameworkPropertyMetadataOptions.AffectsMeasure, new PropertyChangedCallback(OnTheWidthHeightPropertyChanged)));

Как можно увидеть, значение по умолчанию у меня равно 50. Но система не понимает, как же так, свойство относится к классу WidthHeight, а я пытаюсь его нашпинговать значением 50 (который имеет либо тип double либо int).
Поэтому осталось побороться со значением по умолчанию.

Если что-то не так то поправьте меня))
...
Рейтинг: 0 / 0
Binding и UserControl
    #37699796
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_myzn,
О ЕЕЕЕЕ
Я добил эту дрянь))) Заснул поздно но добил)).
Смотри.
У тебя почти все гуд. Косяк только в одном сейчас объясню подробно.

Код: 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.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
public class WidthHeight : INotifyPropertyChanged
    {
        public WidthHeight()
        {
            Width = 50;
            Height = 50;
            MirrorWidthHeight = this;
        }

        public WidthHeight(int width1, int height1)
        {
            this.Width = width1;
            this.Height = height1;
            MirrorWidthHeight = this;
        }

        /// <summary>
        /// Gets or sets the height of the width.
        /// </summary>
        /// <value>
        /// The height of the width.
        /// </value>
        public WidthHeight MirrorWidthHeight
        {
            get
            {
                return new WidthHeight(this.Height, this.Width);
            }
            set
            {
                OnPropertyChanged("MirrorWidthHeight");
            }
        }

        private int width;
        /// <summary>
        /// Gets or sets the pathology results.
        /// </summary>
        /// <value>
        /// The pathology results.
        /// </value>
        public int Width
        {
            get { return width; }
            set
            {
                width = value;
                MirrorWidthHeight = this;
                OnPropertyChanged("Width");
            }
        }

        private int height;
        /// <summary>
        /// Gets or sets the pathology results.
        /// </summary>
        /// <value>
        /// The pathology results.
        /// </value>
        public int Height
        {
            get { return height; }
            set
            {
                height = value;
                MirrorWidthHeight = this;
                OnPropertyChanged("Height");
            }
        }

        /// <summary>
        /// Occurs when a property value changes.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Called when [property changed].
        /// </summary>
        /// <param name="name">The name.</param>
        private void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)//BiopsyCore
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }

        

        public override string ToString()
        {
            return Height + " " + Width;
        }
    }



Обрати внимание я убрал лишнее и самое ГЛАВНОЕ сделал изменение в свойстве MirrorWidthHeight.
Проверить что Ширина и высота класса WidthHeight реально изменяется - не проблема - достаточно вывести в тектблок в окошко. В общем с этим все ясно.
В итоге убеждаемся - что с этим все гуд (ну это и так понятно, так как зеленый квадрат изменяется).
Если поставить точку останова в

Код: c#
1.
2.
3.
4.
5.
6.
private static void OnTheWidthHeightPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
        {
            RedRectangel thisControl = dependencyObject as RedRectangel;
            thisControl.rect.Width = ((WidthHeight)e.NewValue).Width;
            thisControl.rect.Height = ((WidthHeight)e.NewValue).Height;
        }



то заметишь в старом коде - ничего не происходит. То есть система видит, что КЛАСС WidthHeight не изменяется. Но его внутренние свойства изменяются. Нам осталось система как-то объяснить, что именно класс изменяется, нам как бы на свойство в данный момент этого класса положить)).
Когда ты возвращал в методе MirrorWidthHeight this - ты возвращал текущий класс - то есть он как бы не изменялся. Поэтому система думала что класс не изменился. А вот когда я стал возвращать return new WidthHeight(this.Height, this.Width); в свойстве MirrorWidthHeight, то я каждый раз возвращаю НОВУЮ ссылку класса - то есть по сути система видит изменение класса (а точнее то, что у моего класса новая ссылка). Вот и все волшебство))
...
Рейтинг: 0 / 0
Binding и UserControl
    #37699861
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,

AlexeiK
alex_myzn,

то есть, оповестить о том, что свойство изменилось удается через NEW.
а через inotifypropertychanged не удается.
не знаю, мож у тебя косяк в коде где. слолжно на c# читать

ну вот, двое уже сошлись в том, как это работает.
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700038
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

Если бы утром решал этот вопрос - то наверно быстрее бы выяснил. Под вечер реально голова хуже соображает.
Просто че-то не мог уснуть пока не решил эту проблему - смотришь вроде бы все как гуд. Но подсознательно понимаешь, что PropertyChanged в метаданных не запускается - то есть система не видит изменение класса.

А потом так пораскинул мозгами. Ведь действительно, когда мы изменяем типы значений - то для изменения состояния достаточно изменить это самое значение.
А ведь для классов изменение внутренних свойств ничего не говорит. Внутри класса может происходить что угодно - но ссылка все это время будет указывать на одну и ту же память - а значт система понимает, что класс не изменился. Поэтому нужен NEW.
Надо было твое предыдущее сообщение повнимательнее прочитать - съэкономил бы кучу времени))
Я тебе кстати в какой-то ветке вопрос задавал. Что скажешь по поводу Prism? Я посмотрел статьи - понял что убью много времени. А мне в ближайшее время ох как этого не хочется.
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700064
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrusAlexeiK,
Я тебе кстати в какой-то ветке вопрос задавал. Что скажешь по поводу Prism? Я посмотрел статьи - понял что убью много времени. А мне в ближайшее время ох как этого не хочется.

я не стал отвечать, не хочется флуда :)
я спрашивал про это уже у других, вот почитай : 11374344
там не прям про это, но ты поймешь как найти ответ.
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700082
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK,

Понял, спасибо, пробежался по топику.
Думаю если и займусь этим, то точно не в ближайшее время
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700195
alex_myzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо всем за помощь!!!
Как я понял все пришли к выводу что для отработки OnTheWidthHeightPropertyChanged необходимо создать новый объект WidthHeight который используется в свойстве зависимостей. Мы тоже склонялись к этому выводу у себя с группе. К сожалению мы не нашли возможности оповестить систему через INotifyPropertyChanged или что-то другое, что изменение одного из свойств должно оповестить об изменение всего объекта.
Как резюме мне кажется что данный подход является недоработкой в WPF (ну или этот вопрос недостаточно хорошо освещен в первоисточниках). По моему вполне логично предоставление подобного механизма. Представьте довольно сложную иерархическую структуру части которой необходимо визуализировать разными вариантами причем одни из вариантов служат для ее редактирования другие для просмотра в разных представлениях а третье это вообще некие внешние воздействия на структуру извне. Вполне логично что возникает вопрос о том что хотелось бы что бы все изменения синхронно отражались в во всех вариантах ее представления. Что Что же у нас получается, необходимо заново пересоздать часть или всю структуру только если в ней был изменен всего один параметр? Для RedRectangel просто, всего-то длинна и ширина. А если у нас 100 таких RedRectangel и не только их, а еще куча всяких примитивов и не примитивов? Получается что для изменения одного надо пересоздавать все. С моей точки зрения это очень расточительно.

Еще раз огромное спасибо за помощь unknownfromrus, AlexeiK, SeVa. Если у кого-то появилась новая информация по этому вопросу я с удовольствием ее почитаю.

PS В группе мы приняли решения реализовать визуальное представления через создания свойств зависимостей и привязки для каждого параметра отдельно, то есть так как считается "правильным".
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700208
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_myzn,

Не обязательно для 100 изменений одного и того же свойства создавать 100 экземпляров класса.
Я думаю ты уловил основную суть - для того, чтобы свойство зависимости поняло что произошло изменение (в твоем случае) надо изменять ссылку на класс.
А что тебе мешает создать ВСЕГО 2 объекта класса и потом каждый раз их менять. По сути ты будешь иметь две разные ссылки на память -а значит система будет понимать что произошло изменение. Экономия ресурсов как бы налицо.
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700296
alex_myzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
unknownfromrus,
Это конечно решение вопроса, но согласись это больше смахивает на некие пляски с бубном чем на нормальное, логичное а потому правильное решение. Представать что у тебя целый лист таких объектов, Теперь где-то в сторонке лежит объект который играет роль сменного белья. Ты хочешь поменять белье, берешь этот объект натягиваешь его на себя а старый кладешь на его место теперь кто-то другой тоже хочет поменять свое белье, сбрасывает старое хватает твое, наскоро его стирает, потом запихивает в карманы все что у него было в старом и кладет старое на место "общей подменки"... Так или иначе это все выглядит не очень аппетитно как с точки зрения гигиены так и с точки зрения технологии. :-)
Это конечно шутка все. Мне вообще кажется очень странным что отсутствует механизм поддерживающий оповещение при изменении свойств объекта. При всем количестве, превышающим все разумные пределы, полочек по которым разложена вся технология WPF, не нашлось полочки для подобной простой вещи.
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700347
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot alex_myzn]
Как резюме мне кажется что данный подход является недоработкой в WPF (ну или этот вопрос недостаточно хорошо освещен в первоисточниках). По моему вполне логично предоставление подобного механизма. Представьте довольно сложную иерархическую структуру части которой необходимо визуализировать разными вариантами причем одни из вариантов служат для ее редактирования другие для просмотра в разных представлениях а третье это вообще некие внешние воздействия на структуру извне. Вполне логично что возникает вопрос о том что хотелось бы что бы все изменения синхронно отражались в во всех вариантах ее представления. Что Что же у нас получается, необходимо заново пересоздать часть или всю структуру только если в ней был изменен всего один параметр? Для RedRectangel просто, всего-то длинна и ширина. А если у нас 100 таких RedRectangel и не только их, а еще куча всяких примитивов и не примитивов? Получается что для изменения одного надо пересоздавать все. С моей точки зрения это очень расточительно.
[/quot
Все в порядке с wpf и нет там никаких недоработок. У вас просто нет понимания его binding'a и вы выдумываетет свой.
xaml - единственная технология, которая позволяет без всяких мультиков иметь надцать представлений.
Суть проста: DataContext для объекта, binding - для свойств, чтобы не было лишних телодвижений.
В примере вместо того, чтобы привязать свойства прямоугольника напрямую(это можно сделать очень просто), вы начинаете усложнять себе жизнь с никому не нужными спецконтролами и зависимыми свойствами. Ваш спецконтрол- частный вариант, в wpf контекст может быть любой.
Меняйте концепцию
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700384
alex_myzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa,
Что мы и делаем. :-)
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700733
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_myzn,

Посмотрел внутреннюю кухню DependencyPropertyChangedEventArgs. Именно он определяет изменилось значение свойства зависимости или нет.

Действительно печально, что Майкрософт не предусмотрели этот момент. Если он как-о решается (исключая создание нового класса) - то я этого решения не смог найти.

Единственное что - внутри DependencyPropertyChangedEventArgs увидел что есть методы Equals, а также переопределены операторы == и !=. Вот именно они и информируют PropertyChangedCallback о том, произошло изменение или нет.
Надеюсь Майкрософт в будущем добавит что-то, чтобы мы могли в коде указывать DependencyPropertyChangedEventArgs как сравнивать совйства зависимости, если мы подаем класс.
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700812
alex_myzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А знаете что... Я похоже нашел решение нашей проблемы.
"Свойства зависимости и уведомления" Чарльз Петцольд
Просмотрев наскоро эту статью я понял что класс Freezable реализует эту возможность...
Чарльз ПетцольдКласс Freezable представляет грубый силовой подход к получению уведомлений об изменениях в объектах зависимости.

Например, PathGeometry происходит от Freezable. Оно содержит свойство Figures («Рисунки») типа PathFigureCollection, также происходящего от Freezable. PathFigureCollection содержит объекты типа PathFigure, также происходящего от Freezable. PathFigure содержит свойство, именуемое Segments («Сегменты») типа PathSegmentCollection, также Freezable. PathSegment происходит от Freezable и является базовым классом для классов типа PolyLineSegment и PolyBezierSegment. Эти классы содержат свойства, именуемые Point («Точка») типа PointCollection, также происходящего от Freezable.

Общий эффект: при изменении любой отдельной точки уведомления об изменении прокатываются по всей иерархии объектов и вызывают полную перерисовку графического объекта.

По моему это то что надо. Ну что какие идеи?
...
Рейтинг: 0 / 0
Binding и UserControl
    #37700816
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_myzn,

ну да хорошая штука.
пробуй в своем примере, код выложи.
...
Рейтинг: 0 / 0
Binding и UserControl
    #37702474
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_myzn,

ну как?
интересно же.
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Binding и UserControl
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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