| 
          
            □投稿者/ jinjin (1回)-(2014/08/29(Fri) 17:30:16)
              | ■73233 / inTopicNo.1) | ActualWidth/HeightをVMにバインド |  
 
          
            
              
                |  | 分類:[.NET 全般]
 
 
 VisaulStudio 2012
C#
.NET 4.0
★目的
ImageコントロールにBitmapSource(WriteableBitmap)を表示したい。
ビットマップのサイズは、Imageコントロール(実際には、Imageを囲むBorder)のサイズに合わせたい。
コードで書くと
void Image_SizeChaned(){
  viewModel.ChartSize = new Size(border.ActualWidth,border.ActualHeight);
}
↑↑↑ このようなことをしたい。
★現状と問題点
XAMLで、Width/HeightをViewModelにバインドすることには成功したが、
Windowが開いた時に、サイズをViewModelに反映する方法がわからない。
↑↑↑ 説明が下手ですが…
ウィンドウをマウスで引き伸ばした時は
うまく、VMにサイズが伝わっている。
WindowのImageコントロール関連のXAMLは
<Border x:Name="_ChartBaseControl" Grid.Column="2" 
        v:SizeObserver.Observe="True"
        v:SizeObserver.ObservedWidth="{Binding BitmapWidth,Mode=OneWayToSource}"
        v:SizeObserver.ObservedHeight="{Binding BitmapHeight,Mode=OneWayToSource}"
        >
    <Image DataContext="{Binding ChartingViewModel, Mode=OneWay}"  Source="{Binding Bitmap, Mode=OneWay}"   Stretch="None"  />
</Border>
ここの、"SizeObserver"は、
http://stackoverflow.com/questions/1083224/pushing-read-only-gui-properties-back-into-viewmodel
↑↑↑ここにあります。
ここのバインドはうまく行っている。
★★★問題(聞きたいこと)は、WindowのDataContextにViewModelが設定された時、このバインドが動作してほしい。
DataContextのInjectは
    <Window.DataContext>
        <Binding Mode="OneWay" Path="ViewModel" Source="{StaticResource _viewModelServer}"/>
    </Window.DataContext>
今はコードビハインド(WindowのDataContextChangedイベント)で、
private void Window_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
{
	var v = e.NewValue as MainWindowViewModel;
	if (v != null)
	{
		v.ChartingViewModel.BitmapSize = new Size(_ChartBaseControl.ActualWidth, _ChartBaseControl.ActualHeight);
	}
}
↑↑↑ これを入れれば、万事OKなのです。
この後は、マウスでWindowのサイズを変更(それに伴いBorderのサイズも変更される)
にしたがって、ビットマップのサイズを変更、データの描画、Imageへの表示ができています。
が、できればコードビハインドを削除したいのです。
何卒、
よろしくおねがいします!
JinJin
 |  |