5

どうやら通行止めになったようです。Prism で MVVM を使用しており、インク キャンバスを必要とするビューがあります。ViewModel からビューにバインドされている StrokeCollection を作成しました。ビューモデルからコレクションを設定できますが、ユーザーが描画している間、ビューモデルに変更が反映されません。これを機能させる方法はありますか?

私のViewModelの私のプロパティは次のとおりです:

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

これが私の XAML バインディング行です。

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

何らかの理由で、明らかに InkCanvas は ViewModel に変更を通知しません。

4

2 に答える 2

13

あなたのアプローチの問題は、 が をInkCanvas作成すると仮定することですStrokeCollection。そうではありません-単にアイテムを追加および削除するだけです。また、コレクションが利用できない (つまり is である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));
        }
    }
}

XAML:

<InkCanvas Strokes="{Binding Signature}"/>
于 2009-04-08T08:34:44.727 に答える