Здравствуйте, 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 на переходы между функциями.
Здравствуйте, 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