2017-01-05 8 views
0

イメージを編集できるツールを作成しているので、キャンバスに描画するカスタムコントロールがあります。このコントロールのために、私は解像度と完全に正常に動作するブラシの色をバインドしましたが、CanvasをバインドしようとするとmyViewModelでは常にnullが返されます。依存プロパティCanvasバインディングなし

代わりにListをバインドしようとしましたが、それも機能しませんでした。私は約12時間問題が何であるか把握しようとしていましたので、皆さんに助けを求める時が来たと思いますので、何が間違っているのか理解できるかもしれません。

私はビューモデルにシングルトンを使用していましたが、キャンバスにリンクできましたが、これは悪い作業方法であることを認識していました。

Canvasにアクセスしようとするたびに、初期化しても値はnullになります。

コントロール

public static readonly DependencyProperty CanvasProperty = DependencyProperty.Register(
    "CanvasToDraw", typeof(Canvas), typeof(DrawCanvas), new PropertyMetadata(default(Canvas), null, null)); 

    public Canvas CanvasToDraw 
    { 
     get { return (Canvas)GetValue(CanvasProperty); } 
     set { SetValue(CanvasProperty, value); } 
    } 

     public DrawCanvas() 
    { 
     InitializeComponent(); 
     CanvasToDraw = CanvasGrid; 
    } 

XAML

<Controls:DrawCanvas x:Name="DrawCanvas1" Resolution="{Binding Resolution}" CanvasToDraw="{Binding DrawingCanvas}" RectangleList="{Binding RectangleList, ElementName=DrawCanvas1}" ColorToDraw="{Binding SelectedColor}" HorizontalAlignment="Left" Height="256" Margin="10,40,0,0" VerticalAlignment="Top" Width="256" /> 

のViewModel

 private Canvas _drawingCanvas; 
    public Canvas DrawingCanvas 
    { 
     get { return _drawingCanvas; } 
     set 
     { 
      _drawingCanvas = value; 
      OnPropertyChanged("DrawingCanvas"); 
     } 
    } 

旧姓場合、私はより多くのコードを提供することができますこれは関連するコードの大部分です。そして、私は仕事をしている他のものを持っているので、私はINotifyPropertyChangedを使用します。

+0

ビューモデルでは、UI要素(DrawingCanvasなど)を使用しないでください。それに加えて、「初期化しても」というのは、DrawCanvasコンストラクタのCanvasToDraw = CanvasGridという代入を意味しますか? – Clemens

+0

はい、正しい方法ですか?あなたの意見では、キャンバスからデータを取得する最良の方法は何でしょうか?キャンバスは、この場合ピクセルである長方形の外に存在し、ボタンを押してキャンバスを「きれいにする」ときに、それらを白くするためにアクセスする必要があります。私は四角形のリストをバインドしようとしましたが、何らかの理由で動作しませんでした。(たぶん、特定の場所や何かで初期化する必要があります)+ CanvasGridはCanvasの名前です。私はこれをBlockViewModel .Instance.Canvas = CanvasGrid。しかし、インスタンスの使用をやめました。 – user3678781

+0

ItemsPanelとしてCanvasを使用してItemsControlを使用する必要があります。示された[ここ](http://stackoverflow.com/a/22325266/1136211)。値がバインディングに置き換えられているため、初期化は機能しません。ビューモデルのソースプロパティが 'null'なので' null 'を返します。バインディングも双方向でなければなりません。 – Clemens

答えて

0

私はずっと長い間ソリューションを探していましたが、答えはとてもシンプルでした。私はバインディングが2つの方法であると仮定しましたが、納得のいくことに、Mode = TwoWayを設定しなければならず、すべてが魅力的に機能しました。 (キャンバスではなく、観察可能なコレクションをリンクする)

関連する問題