2012-12-05 16 views
7

मेरे पास मेरे एक्सएएमएल + सी # विंडोज स्टोर एप्लिकेशन में चेक बॉक्स है। इसके अलावा मेरे पास बूल प्रॉपर्टी है: WindowsStoreTestApp.SessionData.RememberUser जो सार्वजनिक और स्थैतिक है।एक्सएएमएल संपत्ति के लिए बाध्यकारी

मैं इस बूल संपत्ति में लगातार (या बाध्य, या मैप) होने के लिए चेक बॉक्स की संपत्ति IsChecked चाहता हूं। XAML

<CheckBox x:Name="chbRemember1" IsChecked="{Binding Mode=TwoWay}"/> 

सी #

chbRemember1.DataContext = SessionData.RememberUser; 

कोड संपत्ति के लिए:

मैं इस कोशिश की

namespace WindowsStoreTestApp 
{ 
    public class SessionData 
    { 
     public static bool RememberUser { get; set; } 
    } 
} 

लेकिन यह काम करने के लिए प्रतीत नहीं होता। क्या आप मेरी मदद कर सकते हैं?

+0

क्या आप स्पष्टीकरण दे सकते हैं कि इसके बारे में क्या काम नहीं करता है? क्या यह दो-तरफा अद्यतन है जो काम नहीं करता है? क्या यह बिल्कुल काम नहीं करता है? साथ ही, क्या आप सत्र डेटा (विशेष रूप से RememberUser) के लिए कोड दिखा सकते हैं? इससे हमें समस्या का निदान करने में मदद मिलेगी। –

+0

जब भी उनमें से एक बदलता है, दूसरा भी बदलना चाहिए। – imslavko

+0

जो भी मैं बदलता हूं, मानचित्रण काम नहीं करता है। मैंने कोड में संपत्ति बदलने की कोशिश की, चेकबॉक्स चेक नहीं किया था। विपरीत, चेक किए गए चेकबॉक्स का प्रयास किया, फिर डीबगर में देखा, संपत्ति – imslavko

उत्तर

3

आपके चेक बॉक्स को संपत्ति में किसी भी बदलाव के "जागरूक" होने के लिए आपको कुछ बदलाव अधिसूचना लागू करने की आवश्यकता है। सबसे अच्छा शर्त है कि वहां कई एमवीवीएम फ्रेमवर्कों में से एक का उपयोग करना है, यदि नहीं, तो अपने ViewModel में INotifyPropertyChanged लागू करें।

इसके अलावा, आम तौर पर WPF में, हम व्यक्तिगत नियंत्रण के DataContext सेट नहीं है, लेकिन एक ViewModel करने के लिए खिड़की या उपयोगकर्ता नियंत्रण के DataContext सेट ...

यहाँ के माध्यम से परिवर्तन सूचना के साथ एक संपत्ति का एक उदाहरण है MVVM ढाँचे में से एक:

private bool createTrigger; 
public bool CreateTrigger 
{ 
    get { return createTrigger; } 
    set { createTrigger = value; NotifyPropertyChanged(m => m.CreateTrigger); } 
} 

आप देख सकते हैं एक साधारण ऑटो कार्यान्वित संपत्ति WPF में बाध्यकारी डेटा के लिए इस्तेमाल नहीं किया जा सकता है ...

मैं MSDN पर अधिक Data Binding Overview से गुजर रही सलाह देते हैं ..

+0

आपके उत्तर के लिए धन्यवाद। क्या एकमात्र संपत्ति बांधने का कोई आसान तरीका है? मैं केवल एक संपत्ति के लिए कोड उत्पन्न नहीं करना चाहता, फिर परिवर्तन ईवेंट को संभालना आसान है। – imslavko

+0

अपनी विंडो या उपयोगकर्ता नियंत्रण के डेटाकॉन्टेक्स्ट को एक व्यूमोडेल क्लास में सेट करने के लिए बिल्कुल जटिल नहीं है और उस वर्ग में ऊपर दिखाए गए एक संपत्ति को परिभाषित करें। यदि आप किसी एमवीवीएम फ्रेमवर्क के साथ काम नहीं करना पसंद करते हैं, तो आपके नियंत्रण को संपत्ति में किसी भी बदलाव के बारे में सूचित करने के लिए उस वर्ग पर INotifyPropertyChanged इंटरफ़ेस को कार्यान्वित करना सबसे आसान है। यह वास्तव में इतना नहीं है कि सभी के बाद कोड ... –

5
<CheckBox x:Name="chbRemember1" IsChecked="{Binding Path=RememberUser, Mode=TwoWay}"/> 

 

public class SessionData : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string info) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 


    bool _rememberUser; 
    public bool RememberUser 
    { 
     get 
     { 
      return _rememberUser; 
     } 
     set 
     { 
      _rememberUser = value; 
      NotifyPropertyChanged("RememberUser"); 
     } 
    } 
} 
3

, इस तरह का प्रयास करें ध्यान दें कि संपत्ति स्थिर नहीं है, लेकिन समर्थन क्षेत्र है:

public class SessionData : INotifyPropertyChanged 
{ 
    private static bool _rememberUser; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public bool RememberUser 
    { 
     get { return _rememberUser; } 
     set 
     { 
      _rememberUser = value; 
      OnPropertyChanged(); 
     } 
    } 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
this.DataContext = new SessionData(); 
<CheckBox x:Name="chbRemember1" IsChecked="{Binding RememberUser, Mode=TwoWay}"/> 
3

आप स्थैतिक गुणों से बंध नहीं सकते क्योंकि स्थैतिक गुण PropertyChanged ईवेंट नहीं बढ़ा सकते हैं। आप निश्चित रूप से, INotifyPropertyChanged की आवश्यकता होगी। लेकिन यह स्थैतिक गुणों के साथ प्रासंगिक नहीं है। आप बस स्थिर गुणों से बंधे नहीं जा सकते हैं। (आप डब्ल्यूपीएफ और सिल्वरलाइट में कर सकते हैं)

संबंधित मुद्दे