2009-04-07 30 views
5

私は道路ブロックに遭遇したようです。私たちはPrismでMVVMを使用しており、Ink Canvasを必要とするViewを持っています。 ViewModelからビューにバインドされているStrokeCollectionを作成しました。私は私のビューモデルからコレクションを設定することができますが、ユーザーが描画している間にViewModelに変更が加わっていません。この仕事をする方法はありますか?私のViewModelでMVVM InkCanvasへのバインド

私の財産は次のとおりです。どうやらInkCanvasは変更のViewModelに通知することはありませんいくつかの理由について

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

:ここではラインを結合私のXAMLで

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

答えて

11

InkCanvasStrokeCollectionを作成すると仮定した場合の問題点があります。それは単にそれにアイテムを追加したり削除したりするだけではありません。コレクションは、(すなわち。nullで)利用できない場合や、結合は失敗し、InkCanvasはそれでを行うことはありません。

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)); 
     } 
    } 
} 

:だから:あなたはコレクション自体

例コード、コレクションの内容が変更されると想定する必要はありません単一StrokeCollection

  • を作成する必要が

    1. そしてXAML:

      <InkCanvas Strokes="{Binding Signature}"/> 
      
  • +0

    私はINotifyCollectionChangedセクションがありませんでした。私はStrokeCollectionをインスタンス化することを含む他のすべてを持っていました。ケントに感謝します。 – cjibo

    +0

    これはうまく動作します。 _stokesがバインドされていてもnullの場合、InkCanvasが引き続き興味深いことがわかります。 – CRice

    2

    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; 
        } 
    
    } 
    

    それが役に立てば幸い!

    関連する問題