私はWPFとデータバインディングを学び、活用しようとしています。このスニペットに示すように、3つの画像のいずれかを表示する列を持つリストビューがあります。
<GridViewColumn Header="Status" Width="50">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Image x:Name="TheImage" Height="18"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Status}" Value="queued">
<Setter TargetName="TheImage" Property="Source" Value="Images\que_48.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Status}" Value="completed">
<Setter TargetName="TheImage" Property="Source" Value="Images\complete_48.png" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Status}" Value="failed">
<Setter TargetName="TheImage" Property="Source" Value="Images\fail_48.png" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
PropertyChangeイベントを処理するための次のコードを含むクラス(BatchQueueItem)があります。
public string status;
public string Status
{
get { return status; }
set
{
status = value;
OnPropertyChanged("Status");
}
}
// Create the OnPropertyChanged method to raise the event
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string status)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(status));
}
}
そして、リストビューウィンドウページにボタンがあります。
private void btnStart_Click(object sender, RoutedEventArgs e)
{
foreach (var item in listView1.Items)
{
BatchQueueItem bqi = (BatchQueueItem)item;
string currFile = bqi.CurrFile;
if (mainWindow.isIsbnInFileName(ref currFile))
{
bqi.Status = "completed";
}
else
{
bqi.Status = "failed";
}
}
}
私が抱えている問題は、foreachループが完了し、btnStart_Click()メソッドが完了するまで画像が更新されないことです。それが発生すると、すべてのイメージが期待どおりに更新されますが、繰り返しではなく一度にすべて更新されます。
私が望んでいたこと、そして私が起こると思ったことは、foreachループの各反復が対応する行のイメージを更新するということでした。間違いなく、これがどのように機能するかについて重要な何かが欠けています。任意のヒント?