Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Можно глупый вопрос? / 17 сообщений из 17, страница 1 из 1
26.03.2013, 16:43
    #38198983
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
Я тут прочитал, что, чтобы модель информировала представление о своём изменении, то надо реализовать интерфейс INotifyPropertyChanged. А чтобы наоборот - представление известило о своём изменении модель - ничего делать не надо? Этакая односторонняя обязанность?

Ну, просто если привязка двунаправленная, то почему с одной стороны надо чего-то реализовывать, а с другой - нет?
...
Рейтинг: 0 / 0
26.03.2013, 16:59
    #38199020
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
user7320,

потому что в представлении это уже сделали за вас. Прочитайте про Binding вообще, и направленность в частности.
...
Рейтинг: 0 / 0
27.03.2013, 12:52
    #38200316
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
Да читал я про это много раз уже. Я не понимаю смысла этого интерфейса. Я вот не реализовывал его в своих классах модели представления, а просто указал в байндинге в представлении только следующее

Код: xml
1.
Value="{Binding Path=MyValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"



И всё работает.

Далее, я посмотрел сюда http://msdn.microsoft.com/en-us/library/ms752347(v=vs.100).aspx
авторNote that to detect source changes (applicable to OneWay and TwoWay bindings), the source must implement a suitable property change notification mechanism such as INotifyPropertyChanged.
Затем сюда http://msdn.microsoft.com/ru-ru/magazine/dd419663.aspx
авторИнтерфейс INotifyPropertyChanged содержит событие под названием PropertyChanged. Если у свойства объекта модели представления есть новое значение, она может создать событие PropertyChanged для уведомления системы привязки WPF о новом значении. После получения этого уведомления система привязки опрашивает свойство, и привязанное свойство какого-то элемента пользовательского интерфейса получит новое значение.
Затем сказал и глянул пример Джоша Смита по вышеупомянутой статье, где у него код буквально следующий (такой же и в статье)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/// <summary>
/// Raises this object's PropertyChanged event.
/// </summary>
/// <param name="propertyName">The property that has a new value.</param>
protected virtual void OnPropertyChanged(string propertyName)
{
	this.VerifyPropertyName(propertyName);

	PropertyChangedEventHandler handler = this.PropertyChanged;
	if (handler != null)
	{
		var e = new PropertyChangedEventArgs(propertyName);
		handler(this, e);
	}
}


Этот код вообще в себе ничего не содержит, кроме костыля для проверки наличия свойства с таким именем (лечится рефлексией и лямбда-выражениями) и собственно вызова события изменения свойства. Причём событие, судя по всему, предназначено для системы привязки, ибо никаких подписчиков на это событие в коде программы у него не обнаружено.

Получается, что если модель представления не может измениться кроме как через представление, то смысла в этом интерфейсе (INotifyPropertyChanged) нет. Т. е. если это не какое-нибудь многопоточное приложение, у которого модель может поменять клиент, работающий одновременно с другими клиентами, то этот интерфейс не нужен?



Далее, теперь представим, что то, что написано - правда. Тогда события развиваются таким образом:

1. Я изменяю значение в представлеии.
2. Через привязку, пройдя кучу валидаций, модель представления получает новое значение.
3. В модели представления возникает событие изменение свойства.
4. Модель представления извещает представление, что у неё изменилось свойство.
5. Представление меняет своё свойство в соответствии с новым свойством модели представления.

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


И снова вопрос - зачем нужен этот интерфейс? В каких сценариях, кроме многопоточности, модель представления может поменяться не через представление, а как-то по-другому, что потребует ДЕЙСТВИТЕЛЬНОГО обновления представления?
...
Рейтинг: 0 / 0
27.03.2013, 12:54
    #38200326
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
авторВы заметили, что вся эта фигня не нужна, начиная с пункта 2?
Не с п. 2, а с того момента, как модель представления создаёт событие изменения своего свойства.
...
Рейтинг: 0 / 0
27.03.2013, 13:02
    #38200341
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
авторИ снова вопрос - зачем нужен этот интерфейс? В каких сценариях, кроме многопоточности, модель представления может поменяться не через представление, а как-то по-другому, что потребует ДЕЙСТВИТЕЛЬНОГО обновления представления?
Ладно, надо ещё учесть, что модель представления может поменяться не только из-за изменения представления, но и из-за изменения значения в самой модели. Тогда опять сталкиваемся с многопоточностью и прочими штуками. Но тогда и между моделью (М) и моделью представления (МП) должен быть двунаправленный механизм оповещения об изменении свойств. Вот только в приведённой статье и примере кода ничего такого нет - всё однонаправлено. Значения в М меняются через МП у него вот так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public string Email
{
	get { return _customer.Email; }
	set
	{
		if (value == _customer.Email)
			return;

		_customer.Email = value;

		base.OnPropertyChanged("Email");
	}
}


Т. е. никакого другого способа изменить М нет. А значит, в однопоточном режиме работы такой программы надобность в интерфейсе INotifyPropertyChanged отсутствует, так? Более того, он даже вреден - лишние вычисления и в без того тормозном ВПФе, которому даже аппаратное ускорение не даёт превзойти ВинФормс.

Но вот про применимость этой штуки только в многопоточном приложении нигде-то как раз и не сказано. Более того, в самом примере кода и намёка на многопоточность нет.

Т. е. если бездумно передрать этот код и потом у себя его реализовывать, то кто-то посторонний может недоумённо спросить - "А зачем тебе ЭТО? Оно же тут не работает.".
...
Рейтинг: 0 / 0
27.03.2013, 13:03
    #38200342
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
Выше в коде _customer - это объект модели.
...
Рейтинг: 0 / 0
27.03.2013, 13:41
    #38200415
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
user7320,

при чем тут многопоточность? Например, у вас есть на вьюхе 2 поля, клиент и регион. Если вы выбираете клиента, регион устанавливается автоматически. Если вы выбираете регион, в списке клиентов остаются только клиенты из этого региона. Где тут многопоточность? Однако VM меняется.
...
Рейтинг: 0 / 0
27.03.2013, 13:46
    #38200431
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
user7320Я вот не реализовывал его в своих классах модели представления, а просто указал в байндинге в представлении только следующее
Вы нам пытаетесь доказать, что, INotifyProprtyChanged не нужен?
Если вам так не нравится этот интерфейс - ну, не используйте его, делов-то.
...
Рейтинг: 0 / 0
27.03.2013, 14:09
    #38200472
enigmatic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
user7320Да читал я про это много раз уже. Я не понимаю смысла этого интерфейса. Я вот не реализовывал его в своих классах модели представления, а просто указал в байндинге в представлении только следующее

Код: xml
1.
Value="{Binding Path=MyValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"



И всё работает.
Вы уверены?
Что именно "всё" работает? Работает в обоих направлениях?
Под чем тестируете? SL или WPF?

Смотрите прилагаемый проект, жмите "Modify", делайте выводы.
Это WPF, под SL должно быть так же, хотя и черт его знает.
...
Рейтинг: 0 / 0
27.03.2013, 14:20
    #38200493
enigmatic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
user7320Затем сказал и глянул пример Джоша Смита по вышеупомянутой статье, где у него код буквально следующий (такой же и в статье)
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/// <summary>
/// Raises this object's PropertyChanged event.
/// </summary>
/// <param name="propertyName">The property that has a new value.</param>
protected virtual void OnPropertyChanged(string propertyName)
{
	this.VerifyPropertyName(propertyName);

	PropertyChangedEventHandler handler = this.PropertyChanged;
	if (handler != null)
	{
		var e = new PropertyChangedEventArgs(propertyName);
		handler(this, e);
	}
}


Этот код вообще в себе ничего не содержит, кроме костыля для проверки наличия свойства с таким именем (лечится рефлексией и лямбда-выражениями) и собственно вызова события изменения свойства. Причём событие, судя по всему, предназначено для системы привязки, ибо никаких подписчиков на это событие в коде программы у него не обнаружено.Попробуйте поставить брейкпоинт на if (handler != null), измените свойство, на которое подвязан биндинг, и посмотрите как никаких подписчиков на это событие в коде программы у него не обнаружено.
...
Рейтинг: 0 / 0
28.03.2013, 12:41
    #38202073
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
user7320Т. е. никакого другого способа изменить М нет. А значит, в однопоточном режиме работы такой программы надобность в интерфейсе INotifyPropertyChanged отсутствует, так? Более того, он даже вреден - лишние вычисления и в без того тормозном ВПФе, которому даже аппаратное ускорение не даёт превзойти ВинФормс.

Но вот про применимость этой штуки только в многопоточном приложении нигде-то как раз и не сказано. Более того, в самом примере кода и намёка на многопоточность нет.

Т. е. если бездумно передрать этот код и потом у себя его реализовывать, то кто-то посторонний может недоумённо спросить - "А зачем тебе ЭТО? Оно же тут не работает.".

INotifyPropertyChanged - это основа wpf, тк на нем все построено. Непонимание основ - тормознутые "приложения", которые сделаны через одно место.
...
Рейтинг: 0 / 0
28.03.2013, 13:04
    #38202119
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
Ладно, я понял, что ошибался, тем более, что и сам догадывался уже, что можно много вьюх построить на одной модели представления, и тогда при изменении МП одной из вьюх для автоматического изменения другой вьюхи нужен уже этот интерфейс.


1.

Теперь другой глупый вопрос (не буду новые темы создавать - пусть будет моя тема глупых вопросов). Читаю раздел "Validation Process" (там много пунктов про валидацию). А именно
авторBefore the binding engine runs the ValidationRule objects at any given step, it removes any ValidationError that was added to the Validation.Errors attached property of the bound element during that step.
Там же пример кода для отображения ошибки:
Код: xml
1.
Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"


Меня интересует часть
Код: xml
1.
Path=(Validation.Errors)[0].ErrorContent


Получается, что всегда возможно отобразить только первую ошибку, т. к. второй в коллекции ошибок просто не может появиться по алгоритму валидации, описанному по ссылке? Не зря же тот же Джош Смит в коде отображения ошибки использует немного другой синтаксис:
Код: c#
1.
Path=(Validation.Errors).CurrentItem


?


2.

Читаю тут http://msdn.microsoft.com/en-us/library/bb613546(v=vs.100).aspx, в разделе "How Data Binding References are Resolved", что быстрее всего байндится к "DependencyProperty of a DependencyObject". Вы часто делаете свои модели представления DependencyObject с DependencyProperties, чтобы получить 20-30 дополнительных % производительсности, или забиваете?


3.

В той же статье

авторBind IList to ItemsControl not IEnumerable

If you have a choice between binding an IList<T> or an IEnumerable to an ItemsControl object, choose the IList<T> object. Binding IEnumerable to an ItemsControl forces WPF to create a wrapper IList<T> object, which means your performance is impacted by the unnecessary overhead of a second object.
Т. е. если я перед привязкой преобразую свою коллекцию к списку через расширяющий метод ToList(), то это будет всё равно что оставить его без всяких приведений - всё равно ВПФ этот же метод и вызывает фактически? Т. е. лучше изначально все коллекции в модели представления делать IList?

Вот вы как делаете?
...
Рейтинг: 0 / 0
28.03.2013, 13:06
    #38202123
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
авторТ. е. лучше изначально все коллекции в модели представления делать IList?
Ну, т. е. те, которые байндятся к ItemsControl.
...
Рейтинг: 0 / 0
28.03.2013, 13:44
    #38202228
SeVa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
user7320авторТ. е. лучше изначально все коллекции в модели представления делать IList?
Ну, т. е. те, которые байндятся к ItemsControl.

Красавцы, только после таких пенок помалкивайте в тряпочку о тормознутости wpf.
Если коллекция для редактирования не поддерживате INotifyCollectionChanged, то wpf сам реализует этот интерфейс, что увеличивает накладные расходы по памяти в два раза и дает соответствующие тормоза
...
Рейтинг: 0 / 0
28.03.2013, 15:37
    #38202544
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
SeVauser7320пропущено...

Ну, т. е. те, которые байндятся к ItemsControl.

Красавцы, только после таких пенок помалкивайте в тряпочку о тормознутости wpf.
Если коллекция для редактирования не поддерживате INotifyCollectionChanged, то wpf сам реализует этот интерфейс, что увеличивает накладные расходы по памяти в два раза и дает соответствующие тормоза
У ВПФ тормознутость в отрисовке - т. е. в том, как внутри он взаимодействует с ДХ.
...
Рейтинг: 0 / 0
28.03.2013, 15:42
    #38202562
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
SeVauser7320пропущено...

Ну, т. е. те, которые байндятся к ItemsControl.

Красавцы, только после таких пенок помалкивайте в тряпочку о тормознутости wpf.
Если коллекция для редактирования не поддерживате INotifyCollectionChanged, то wpf сам реализует этот интерфейс, что увеличивает накладные расходы по памяти в два раза и дает соответствующие тормоза
"Реализация интерфейса" подразумевает создание полной копии коллеции? Т. е. когда я на IEnumerable вызываю расширяющий метод ToList, то я на самом деле создаю новую копию коллекции, а не создаю List, который внутри у себя ссылается на тот же массив, что и коллекция, реализующая IEnumerable? Чего ж они не догадались сделать такую оптимизацию?
...
Рейтинг: 0 / 0
28.03.2013, 16:01
    #38202604
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно глупый вопрос?
user7320,

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


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