2009-04-07 2 views
5

Кажется, я столкнулся с дорожным блоком. Мы используем MVVM с Prism и имеем представление, для которого требуется чернильный холст. Я создаю 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 никогда не уведомит ViewModel каких-либо изменений.

ответ

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

+0

Это работает красиво. Мне интересно, что InkCanvas все еще рисует, когда _stokes имеет значение null, даже если привязан. – 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; 
    } 

} 

Надеется, что это помогает!

Смежные вопросы