5

我好像遇到了路障。我们将 MVVM 与 Prism 一起使用,并且有一个需要 Ink Canvas 的视图。我创建了一个从我的 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 回答
3

StrokeCollection 类有一个名为“StrokesChanged”的事件,当您在视图中绘制某些内容时,该事件总是被触发。该事件包含更新的笔画集合。

XAML:

<Grid>
    <InkCanvas Strokes="{Binding Signature}"/>
</Grid>

虚拟机:

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

}

希望能帮助到你!

于 2015-08-12T14:55:38.300 回答