문제
나는로드 블록으로 달려간 것 같습니다. 우리는 프리즘과 함께 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
하지 않을 것입니다 아무것 그것으로. 그래서:
- 싱글을 만들어야합니다
StrokeCollection
- 컬렉션 자체가 아니라 컬렉션의 내용이 변경 될 것이라고 가정해야합니다.
예제 코드 :
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;
}
}
도움이되기를 바랍니다!
제휴하지 않습니다 StackOverflow