別のスレッドからUI要素にアクセスしようとするときは常にディスパッチャーを使用する必要があることは知っていますが、今日、私が質問したいことがありました。クラスRow(カスタムクラス)のオブジェクトが入力されたリストがあり、各行にCell(カスタムクラス)が入力されているとします。各セルには、プロパティCellWidthがあります。ViewModel内にリストを入力し、それをViewに渡して、リストからObservableCollectionを作成します。グリッドの幅は、UIのCellWidthにバインドされています。したがって、Dispatcher(ViewModel内)を使用せずに幅を設定すると、Gridはバインディングを無視しますが、それを使用すると、すべてが正常に機能します。(注:ディスパッチャーを使用しない場合、例外は発生しません)
問題は、なぜそれが起こっているのかということです。ディスパッチャが対処する唯一の問題はスレッド化だと思いました...
public MainPageViewModel()
{
IDataTableModel Table1 = new ObservableCollection<Row>();
setCellWidth(Table1);
}
private void setCellWidth(IDataTableModel model)
{
List<double> Widths = new List<double>();
//initializing Widths with values
<...>
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
foreach(var item in model.Rows)
{
for(int i = 0; i<item.Cells.Count; i++)
{
item[i].CellWidth = Widths[i];
}
}
});
}