質問

いた道路ブロックです。しョとプリズムを眺めることが必要であるインクのキャンバスに入力します。私の作成StrokeCollectionるにとらわれることからViewModelする方は受付にお申し出くださいすることができるようになセットからコレクションのマviewmodelが変化しないらしい造形はそのままに、ViewModelながら、ユーザーの描く.があるのです。

もっViewModelし

private StrokeCollection _strokes;
public StrokeCollection Signature
{
     get
     {
         return _strokes;
     }
     set
     {
         _strokes = value;
         OnPropertyChanged("Signature");
     }
}

こちらはマー結合線

<InkCanvas x:Name="MyCanvas" Strokes="{Binding Signature, Mode=TwoWay}" />

その話を聞いてみると、どうやらInkCanvasいを通知しViewModelの変化します。

役に立ちましたか?

解決

問題はそれがすごいとの InkCanvas を作成し StrokeCollection.ない-るだけで追加、削除項目からします。た場合の収集になります。は nullの結合が失敗の InkCanvas とん します。い:

  1. を作成する必要がありますシングル StrokeCollection
  2. 必要なものについて、内容のコレクションの変更ではなく、収集そのもの

例コード:

public class ViewModel : INotifyPropertyChanged
{
    private readonly StrokeCollection _strokes;

    public ViewModel()
    {
        _strokes = new StrokeCollection();
        (_strokes as INotifyCollectionChanged).CollectionChanged += delegate
        {
            //the strokes have changed
        };
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public StrokeCollection Signature
    {
        get
        {
            return _strokes;
        }
    }

    private void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

びー:

<InkCanvas Strokes="{Binding Signature}"/>

他のヒント

StrokeCollectionクラスを使用すると、ビューの中で何かを描くときは常に発射される「StrokesChanged」というイベントがあります。このイベントは、更新されたストロークのコレクションが含まれています。

XAMLます:

<Grid>
    <InkCanvas Strokes="{Binding Signature}"/>
</Grid>

VMます:

public class TestViewModel : INotifyPropertyChanged
{
    public StrokeCollection Signature { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public TestViewModel()
    {
        Signature = new StrokeCollection();
        Signature.StrokesChanged += Signature_StrokesChanged;
    }

    void Signature_StrokesChanged(object sender, StrokeCollectionChangedEventArgs e)
    {
        //PUT A BREAKPOINT HERE AND CHECK
        Signature = (System.Windows.Ink.StrokeCollection)sender;
    }

}

それが役に立てば幸い!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top