wpfで書かれたアプリケーションがあり、WebページをダウンロードしてHTMLコードを解析して値を保存します。DependencyObjectと同じスレッドでDependencySourceを作成する必要があります
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;
}
これは私が使用しているオブジェクトモデルです。それは単純化されたバージョンであり、私はあなたがそれを再編成することを望んでいない、私はこのようにそれを書いた理由がある。 ListOfItems
では、クラスはすべてのジョブを実行するメソッドです(コードを読みやすくするために内部で使用されているいくつかのメソッドがあります) - ソースをダウンロードし、解析し、データを埋め込みます(ListToBind
、f.e.
[0] => NameOfItem = "FirstOne", Properties = {99, #FF00FF00}
[1] => NameOfItem = "SecondOne", Properties = {50, #FFFF0000}
etc.
あなたがその仕事を完了DownloadItems
この方法は、OnDownloadCompleted
イベントが発生したとき、見ることができるように。メインスレッドは、次のされているコードにMainWindow.xaml
に
void listOfItems_OnDownloadCompleted(object sender, EventArgs args)
{
dataGrid.Dispatcher.Invoke(new Action(() => {
dataGrid.ItemsSource = ListOfItemsInstance.ListToBind;
}));
}
データグリッドがあるため、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>
うまく動作します。しかし、この問題があります。コメントの付いたxamlスニペットのコメントを外してみると、Must create DependencySource on same Thread as the DependencyObject.
というエラーが表示されます。
最後に、私の質問は、このエラーを回避する方法です。
EDIT:
それは最後に次のようになります。この写真はMS Excelから取り込まれ、Adobe Photoshopで色付けされています。
この説明をありがとう。この質問の2番目の答えはおそらく同じ方法ですが、問題は私が知らなかったこと、何を凍結するかです。さて、SolidColorBrushがDispatcherObjectから派生し、状況を説明したと言ったとき、私はそれを動作させました。もう一度ありがとう、賞金はあなたです。 –