Update2
Я переписал весь вопрос, потому что некоторые вещи стали намного понятнее, теперь проблема заключается в том, что я создал список свойств DependencyProperties в другом потоке, отличном от того, где будут использоваться свойства DependencyProperties: (.
Когда я работаю над BackgroundWorker
, привязки XAML
вызывают ArgumentException
Необходимо создать DependencySource в том же потоке, что и объект DependencyObject.
У меня есть следующие настройки:
У меня есть простой класс, который реализует INotifyPropertyChanged
, который содержит несколько целых, списков и словарей.
public class Calculator : INotifyPropertyChanged
{
//Note that InstanceGroup is a dependency object
private List<InstanceGroup> instanceGroups = new List<InstanceGroup>();
public List<InstanceGroup> InstanceGroups
{
get { return instanceGroups; }
set { instanceGroups = value; }
}
// snip //
public void Calculate()
{
InstanceGroups = MyNewFilledInstanceGroup;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("instanceGroups"));
}
}
}
В UserControl
я использую BackgroundWorker
для запуска метода Calculate
, потому что это может занять много времени:
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += delegate(object o, DoWorkEventArgs args)
{
lock (Calculator)
{
Calculator.Calculate();
}
};
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
В файле XAML
UserControl
у меня есть несколько привязок к Calculator
, например {Binding Path=Calculator.InstanceGroups, Path=userControlName}
.
(Общая цель - выполнить всю работу в методе Calculate в отдельном потоке, чтобы я мог показать индикатор выполнения или что-то в этом роде)