Я прочитал много сообщений, статей и т.д. о привязке и привязке к потокам элементов управления GUI. Есть пост, в котором люди не хотят использовать Dispatcher
.
У меня также есть напарник, который избегает использования Dispatcher в своем коде. Я спросил его о причине, но его ответ меня не удовлетворил. Он сказал, что ему не нравится такая «магия», спрятанная в классе.
Ну, я фанат следующего класса.
public class BindingBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private Dispatcher Dispatcher
{
#if SILVERLIGHT
get { return Deployment.Current.Dispatcher; }
#else
get { return Application.Current.Dispatcher; }
#endif
}
protected void RaisePropertyChanged<T>(Expression<Func<T>> expr)
{
var memberExpr = (MemberExpression)expr.Body;
string property = memberExpr.Member.Name;
var propertyChanged = PropertyChanged;
if (propertyChanged == null) return;
if (Dispatcher.CheckAccess())
propertyChanged.Invoke(this, new PropertyChangedEventArgs(property));
else
Dispatcher.BeginInvoke(() => RaisePropertyChanged(expr));
}
}
Вот вопрос. Есть ли причины, по которым некоторые люди не хотят использовать такой класс? Возможно, мне придется пересмотреть этот подход.
Согласитесь, есть одна странность. Dispatcher.CheckAccess ()
исключен из Intellisense. Возможно, из-за этого они немного пугают.
С уважением
РЕДАКТИРОВАТЬ:
Хорошо, еще один пример. Рассмотрим сложный объект. Коллекция в качестве примера, возможно, была не лучшей идеей.
public class ExampleVm : BindingBase
{
private BigFatObject _someData;
public BigFatObject SomeData
{
get { return _someData; }
set
{
_someData = value;
RaisePropertyChanged(() => SomeData);
}
}
public ExampleVm()
{
new Action(LoadSomeData).BeginInvoke(null, null); //I know - it's quick and dirty
}
private void LoadSomeData()
{
// loading some data from somewhere ...
// result is of type BigFatObject
SomeData = result; // This would not work without the Dispatcher, would it?
}
}