2009-04-07 16 views
5

पर बाध्यकारी मुझे लगता है कि एक सड़क ब्लॉक में भाग गया है। हम प्रिज्म के साथ एमवीवीएम का उपयोग कर रहे हैं और एक ऐसा दृश्य है जिसके लिए एक इंक कैनवास की आवश्यकता है। मैंने स्ट्रोक कोलेक्शन बनाया है जो मेरे व्यू मॉडेल से व्यू में बाध्य है। मैं अपने व्यूमोडेल से संग्रह सेट करने में सक्षम हूं लेकिन उपयोगकर्ता ड्रॉ करते समय व्यू मॉडेल में बदलाव नहीं आ रहा है। क्या यह काम करने का कोई तरीका है?एमवीवीएम इंककैनवास

मेरी ViewModel में मेरे संपत्ति इस प्रकार है:

<InkCanvas x:Name="MyCanvas" Strokes="{Binding Signature, Mode=TwoWay}" /> 

किसी कारण से जाहिरा तौर पर InkCanvas कभी नहीं सूचित करता है किसी भी परिवर्तन की ViewModel:

private StrokeCollection _strokes; 
public StrokeCollection Signature 
{ 
    get 
    { 
     return _strokes; 
    } 
    set 
    { 
     _strokes = value; 
     OnPropertyChanged("Signature"); 
    } 
} 

यहाँ मेरी XAML बाइंडिंग रेखा है।

उत्तर

11

आपके दृष्टिकोण के साथ समस्या यह है कि आप मानते हैं कि InkCanvasStrokeCollection बनाता है। यह नहीं करता - यह केवल इससे जोड़ता है और हटा देता है। और यदि संग्रह उपलब्ध नहीं है (यानी 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)); 
     } 
    } 
} 

और एक्सएएमएल:

<InkCanvas Strokes="{Binding Signature}"/> 
+0

मुझे INotifyCollectionChanged अनुभाग गुम था। स्ट्रोक कोलेक्शन को तत्काल करने सहित मेरे पास सब कुछ था। धन्यवाद केंट। – cjibo

+0

यह अच्छी तरह से काम करता है। मुझे यह दिलचस्प लगता है कि इंक कन्ववास अभी भी खींचता है जब बाधा होने पर भी _stokes शून्य है। – CRice

2

स्ट्रोककोलेक्शन क्लास में "स्ट्रोक चेंजेड" नामक एक ईवेंट होता है जिसे आप दृश्य में कुछ खींचते समय हमेशा निकाल दिया जाता है। उस घटना में अद्यतन स्ट्रोक का संग्रह शामिल है।

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

} 

आशा है कि यह मदद करता है!