Что происходит если присвоить забинденному свойству такое же значение
От: Alexander_fx  
Дата: 28.03.16 22:40
Оценка:
привет
вот такой вопрос
есть свойство — например цвет
на него забинден цвет фона контрола
что будет если я буду присваивать свойству тот же цвет что и текущее значение
будет перерисовываться тот же цвет и тратиться ресурсы или там в бинденге есть встроенная проверка

просто сейчас я пишу так —
if new_value<>current_value then current_value=new_value
и думаю а не дурак ли я и есть встроенная проверка
подскажите что там и как правильно
Спасибо
Re: Что происходит если присвоить забинденному свойству такое же значение
От: _ichensky Европа https://github.com/ichensky
Дата: 28.03.16 23:13
Оценка:
Здравствуйте, Alexander_fx, Вы писали:

A_>привет

A_>вот такой вопрос
A_>есть свойство — например цвет
A_>на него забинден цвет фона контрола
A_>что будет если я буду присваивать свойству тот же цвет что и текущее значение
A_>будет перерисовываться тот же цвет и тратиться ресурсы или там в бинденге есть встроенная проверка

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

т.е. надо писать как-то так:
set{
  if (new_value!=current_value){ 
     current_value=new_value; 
     RaiseAllBindingFucntions(); // райзим ивент, срабатывают все функции подписчики, забинденные на эту функцию.
     return;
  }
  else{
  // Do nothing..
  return ;
  }
}

(wpf?)втроенная проверка хз- но на подобное свойство может быть куча разных биндингов и если в одной из функций есть проверка, то во всех остальных может и не быть+тратиться лишнее cpu на переходы между функциями.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re: Что происходит если присвоить забинденному свойству такое же значение
От: Sinatr Германия  
Дата: 29.03.16 07:50
Оценка:
Здравствуйте, Alexander_fx, Вы писали:

A_>что будет если я буду присваивать свойству тот же цвет что и текущее значение

A_>будет перерисовываться тот же цвет и тратиться ресурсы или там в бинденге есть встроенная проверка

На SO спрашивали: тыц, тыц.

WPF действительно "оптимизирован", но не так как вы думаете. Биндинг обрабатывается прямолинейно: сработало событие (или был вызван UpdateTarget/UpdateSource) -> свойству таргету/источнику (зависит от типа биндинга) присваивается значение. Другое дело как на это изменение свойства реагирует view. Если переприсвоить SelectedItem то же значение, то событие SelectedItemChanged не вызовется и как следствие может не сработать attached behavior и т.д.


A_>if new_value<>current_value then current_value=new_value

A_>и думаю а не дурак ли я и есть встроенная проверка

Вы не указали вызов события, если вы имели в виду проверку в сеттере типа
SomeType _someProperty;
public SomeType SomeProperty
{
    get { return _someProperty; }
    set
    {
        if(value != _someProperty)
        {
            _someProperty = value;
            OnPropertyChanged();
        }
    }
}

то это зависит насколько "дорогое" это удовольствие, обновить свойство. В общем случае следуйте трезвой логике, в wpf рендеринг (включая layout) в любом случае отложеный и параллельный тому, что вы делаете в view model. Вряд ли это будет тем самым "узким местом". Если свойств много и меняются несколько, то сценарий другой, в этом случае лучше отложить вызов события до того момента, когда все свойства обновлены. Что-то вроде
public SomeType SomeProperty1 { get; set; }
public SomeType SomeProperty2 { get; set; }
public SomeType SomeProperty3 { get; set; }
public SomeType SomeProperty4 { get; set; }
...

// usage
SomeProperty1 = someValue1;
SomeProperty2 = someValue2;
...
OnPropertyChanged(""); // update all
---
ПроГLамеры объединяйтесь..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.