Tengo una aplicación escrita en wpf, que descarga algunas páginas web, analiza el código html y guarda algunos valores.Debe crear DependencySource en el mismo hilo que DependencyObject
class ListOfItems
{
public List<SomeObject> ListToBind;
public void DownloadItems()
{
Task.Factory.StartNew(() =>
{
...
...
if (OnDownloadCompleted != null)
OnDownloadCompleted(this, EventArgs.Empty);
}
}
}
class SomeObject
{
public string NameOfItem;
public MyClass Properties;
}
class MyClass
{
public int Percentage;
public SolidColorBrush Color;
}
Este es el modelo de objetos que estoy usando. Es una versión simplificada y no quiero que lo reorganices, hay una razón por la que lo escribí de esta manera. En ListOfItems
la clase es un método que hace todo el trabajo (hay otros métodos que se usan dentro para hacer que el código sea legible) - descarga fuente, analiza y rellena ListToBind
con datos, es decir,
[0] => NameOfItem = "FirstOne", Properties = {99, #FF00FF00}
[1] => NameOfItem = "SecondOne", Properties = {50, #FFFF0000}
etc.
Como se puede ver, cuando este método DownloadItems
completa su trabajo, se eleva OnDownloadCompleted
evento. En el hilo principal se siguiente código
void listOfItems_OnDownloadCompleted(object sender, EventArgs args)
{
dataGrid.Dispatcher.Invoke(new Action(() => {
dataGrid.ItemsSource = ListOfItemsInstance.ListToBind;
}));
}
DataGrid en el MainWindow.xaml
se llena con los valores, a causa de fragmento de código siguiente xaml.
<DataGrid Name="dataGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Tag" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Color" Binding="{Binding MyClass.Percentage}">
<!--<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="{Binding MyClass.Color}" />
</Style>
</DataGridTextColumn.CellStyle>-->
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
Funciona bien. Pero hay este problema. Intenta descomentar el fragmento xaml comentado y obtendrás el error Must create DependencySource on same Thread as the DependencyObject.
.
Finalmente, mi pregunta es, ¿cómo evitar este error?
EDIT:
Se debe tener este aspecto en el final. Esta imagen está tomada de MS Excel y coloreada en Adobe Photoshop.
Gracias por esta explicación. La segunda respuesta a esta pregunta probablemente sea del mismo modo, pero el problema era que no sabía, qué congelar. Ahora, cuando me dijiste que SolidColorBrush se deriva de DispatcherObject y me explicó la situación, lo hice funcionar. Gracias de nuevo, la recompensa es tuya. –