none
WPFで、データバインドを解除する方法 RRS feed

  • 質問

  • いつもお世話になっております。

     

    早速ですが、データバインドに関して質問があります。

    WPFを用い、xamlで以下のような記述をしました。

    <Image Source="{Binding}"  />

    バインドしたのは、

    "C:\xxxxx\xxxxx\test.jpg"

    といったローカルに置かれている画像ファイルへのパスです。

    これで、画像は問題無く表示できるのですが、画像が不要になり削除しようとした際に、他のプロセスが使用しているという理由でアクセスを拒否されます。

    <ListView>や<Grid>内のImage Sourceに指定した画像のバインドを解除し、削除するにはどうしたら良いのでしょうか。

     

    宜しくお願い致します。


    • 編集済み ry_ysd 2011年9月9日 6:11
    2011年9月9日 6:09

回答

  • WPF では BitmapSource が IDisposable ではないので、「削除するために画像を破棄する」ではなく、「削除できるよう画像作成時にファイルから切り離す」という発想で行くべきでしょう。

    XAML やバインディングによって Image.Source に文字列が渡された場合、ImageSource の Converter 属性によって ImageSource(実体は BitmapImage 辺り)に変換されますが、この自動変換では ImageSource が GC によって破棄されるまでファイルがロックされ続けることになります。

    そこで、たとえば Image.Source へのバインディングに IValueConverter を実装した独自のコンバータを追加して、手動で画像に変換する方法が考えられます。BitmapDecoder.Create で BitmapCacheOption.OnLoad を渡せば、データは全てメモリにロードされ、ファイルはロックされなくなります。

    • 回答としてマーク ry_ysd 2011年9月9日 11:12
    2011年9月9日 6:58

すべての返信

  • WPF では BitmapSource が IDisposable ではないので、「削除するために画像を破棄する」ではなく、「削除できるよう画像作成時にファイルから切り離す」という発想で行くべきでしょう。

    XAML やバインディングによって Image.Source に文字列が渡された場合、ImageSource の Converter 属性によって ImageSource(実体は BitmapImage 辺り)に変換されますが、この自動変換では ImageSource が GC によって破棄されるまでファイルがロックされ続けることになります。

    そこで、たとえば Image.Source へのバインディングに IValueConverter を実装した独自のコンバータを追加して、手動で画像に変換する方法が考えられます。BitmapDecoder.Create で BitmapCacheOption.OnLoad を渡せば、データは全てメモリにロードされ、ファイルはロックされなくなります。

    • 回答としてマーク ry_ysd 2011年9月9日 11:12
    2011年9月9日 6:58
  • 有難うございます!

    教えて頂いた方法を用いて無事実現できました。

    2011年9月9日 11:12