2009-04-07 115 views
5

我似乎碰到了一個路障。我們在Prism中使用MVVM,並有一個需要Ink Canvas的View。我創建了一個從我的ViewModel綁定到View的StrokeCollection。我可以從我的viewmodel設置集合,但在用戶繪製時,更改不會發送到ViewModel。有沒有辦法做到這一點?MVVM綁定到InkCanvas

我在我的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從來沒有通知任何變化的視圖模型。

回答

11

您的方法存在的問題是,您認爲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)); 
     } 
    } 
} 

和XAML:

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

我錯過了INotifyCollectionChanged部分。我有其他的一切,包括實例化StrokeCollection。 謝謝肯特。 – cjibo 2009-04-08 13:15:22

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

} 

希望它能幫助!