سؤال

يبدو أنني قد ركضت في كتلة الطريق. نحن نستخدم MVVM مع المنشور ولها رؤية تتطلب قماش حبر. لقد قمت بإنشاء StrokEcolction الذي يتم ربطه من 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 لا يخطر أبدا عرض أي تغيير.

هل كانت مفيدة؟

المحلول

المشكلة مع نهجك هي أنك تفترض 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}"/>

نصائح أخرى

يحتوي فئة 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;
    }

}

آمل أن يساعد!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top