Привязка MVVM к InkCanvas - PullRequest
       16

Привязка MVVM к InkCanvas

5 голосов
/ 08 апреля 2009

Кажется, я столкнулся с дорожным блоком. Мы используем MVVM с Prism и у нас есть представление, для которого требуется Ink Canvas. Я создал коллекцию StrokeCollection, которая связана с моей ViewModel и View. Я могу установить коллекцию из моей модели представления, но изменения не приходят в ViewModel, пока пользователь рисует. Есть ли способ сделать эту работу?

Моя собственность в моей 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 о любых изменениях.

Ответы [ 2 ]

11 голосов
/ 08 апреля 2009

Проблема вашего подхода в том, что вы предполагаете, что 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}"/>
2 голосов
/ 12 августа 2015

У класса 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;
    }

}

Надеюсь, это поможет!

...