문제

나는로드 블록으로 달려간 것 같습니다. 우리는 프리즘과 함께 MVVM을 사용하고 있으며 잉크 캔버스가 필요한보기가 있습니다. 나는 내 뷰 모델에서 뷰로 묶인 뇌졸중을 만듭니다. 내 뷰 모델에서 컬렉션을 설정할 수 있지만 사용자가 그리는 동안 뷰 모델로 변경되지 않습니다. 이 일을 할 수있는 방법이 있습니까?

내 뷰 모델의 내 속성은 다음과 같습니다.

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는 어떤 변화의 뷰 모델을 알리지 않습니다.

도움이 되었습니까?

해결책

당신의 접근 방식의 문제는 당신이 InkCanvas creates the 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}"/>

다른 팁

Strokecececelection 클래스에는 "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;
    }

}

도움이되기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top