2008-09-30 11 views
43

सी # में अनुप्रयोग सेटिंग्स में WPF गुणों को बांधने का सबसे अच्छा तरीका क्या है? क्या Windows फॉर्म एप्लिकेशन में कोई स्वचालित तरीका है? this question के समान, कैसे (और यह संभव है) क्या आप डब्ल्यूपीएफ में एक ही काम करते हैं?सी # में अनुप्रयोग सेटिंग्स में WPF गुणों को बांधने का सबसे अच्छा तरीका?

उत्तर

95

आप सीधे विजुअल स्टूडियो द्वारा बनाई गई स्थिर वस्तु से जुड़ सकते हैं।

अपने विंडोज़ घोषणा में जोड़ें:

xmlns:p="clr-namespace:UserSettings.Properties" 

जहां UserSettings आवेदन नाम स्थान है।

तो फिर तुम सही सेटिंग के लिए एक बाध्यकारी जोड़ सकते हैं:

<TextBlock Height="{Binding Source={x:Static p:Settings.Default}, 
      Path=Height, Mode=TwoWay}" ....... /> 

अब जब आप अपने अनुप्रयोग को बंद आप सेटिंग्स को बचा सकता है, उदाहरण के प्रति: मैं स्वीकार किए जाते हैं जवाब चाहते

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    Properties.Settings.Default.Save(); 
    base.OnClosing(e); 
} 
+1

मुझे आश्चर्य हुआ कि 'दोवे' बाध्यकारी वास्तव में दोनों तरीकों से काम करता है। अच्छा लगा। +1 –

+9

वहां खोजकर्ताओं को ध्यान दें, * दोवे * आवश्यक है या सेटिंग्स सहेजी नहीं जाएंगी। कोशिश करने और उसे समझने के लिए परेशान करना। – Will

+4

थोड़ा अलग वाक्यविन्यास (और एक अच्छा परिचय) के लिए, http://blogs.msdn.com/b/patrickdanino/archive/2008/07/23/user-settings-in-wpf.aspx – Pat

3

क्रिस, मुझे यकीन नहीं है कि यह एप्लीकेशन सेटिंग्स को बांधने का सबसे अच्छा तरीका है, लेकिन इस तरह मैंने इसे Witty में किया।

1) सेटिंग के लिए एक निर्भरता संपत्ति बनाएं जिसे आप विंडो/पेज/उपयोगकर्ता नियंत्रण/कंटेनर में बांधना चाहते हैं। यह मामला है कि मेरे पास ध्वनि चलाने के लिए उपयोगकर्ता सेटिंग है।

public bool PlaySounds 
    { 
     get { return (bool)GetValue(PlaySoundsProperty); } 
     set { SetValue(PlaySoundsProperty, value); } 
    } 

    public static readonly DependencyProperty PlaySoundsProperty = 
     DependencyProperty.Register("PlaySounds", typeof(bool), typeof(Options), 
     new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnPlaySoundsChanged))); 

    private static void OnPlaySoundsChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) 
    { 
     Properties.Settings.Default.PlaySounds = (bool)args.NewValue; 
     Properties.Settings.Default.Save(); 
    } 

2) निर्माता में, आवेदन सेटिंग्स

 PlaySounds = Properties.Settings.Default.PlaySounds; 

3) XAML

में संपत्ति में आबद्ध
 <CheckBox Content="Play Sounds on new Tweets" x:Name="PlaySoundsCheckBox" IsChecked="{Binding Path=PlaySounds, ElementName=Window, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

आप करने के लिए पूर्ण Witty source डाउनलोड कर सकते हैं मैच के लिए संपत्ति के मूल्य को प्रारंभ इसे क्रिया में देखें या केवल code for options window ब्राउज़ करें।

+0

साशा द्वारा विधि में सामान्य रूप से बाध्यकारी है – decasteljau

+0

Uhhh, क्या होता है जब आपके पास 100+ सेटिंग्स? : ओ –

0

इसके अलावा यह कैसे BabySmash

में किया जाता है पर this लेख को पढ़ने के आप केवल (अनिल का उदाहरण की तरह) के साथ सेटिंग वापस करने के लिए यदि आप परिवर्तन सूचना की जरूरत की जरूरत है! पीओसीओ सेटिंग्स कक्षा के लिए बाध्यकारी भी काम करेगा!

5

सबसे आसान तरीका उस ऑब्जेक्ट से जुड़ना होगा जो आपकी एप्लिकेशन सेटिंग्स को गुणों के रूप में उजागर करता है या उस ऑब्जेक्ट को स्टेटिक रिसोर्स के रूप में शामिल करता है और उसमें बाध्य करता है।

एक और दिशा जो आप ले सकते हैं वह अपना खुद का Markup Extension बनाना है ताकि आप केवल PropertyName = "{ApplicationSetting SomeSettingName}" का उपयोग कर सकें। एक कस्टम मार्कअप एक्सटेंशन बनाने के लिए आपको MarkupExtension का उत्तराधिकारी होना चाहिए और MarkupExtensionReturnType विशेषता के साथ कक्षा को सजाने की आवश्यकता है। John Bowen में post on creating a custom MarkupExtension है जो प्रक्रिया को थोड़ा स्पष्ट बना सकता है।

7

, हालांकि मैं एक विशेष मामले में भाग गया। मेरे टेक्स्ट बॉक्स को "केवल पढ़ने" के रूप में सेट किया गया था ताकि मैं केवल कोड में इसका मूल्य बदल सकूं। मुझे समझ में नहीं आया कि मूल्य को सेटिंग्स पर वापस क्यों नहीं भेजा गया था, हालांकि मेरे पास मोड "टूवे" था।http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx

डिफ़ॉल्ट डिफ़ॉल्ट है, जो लक्ष्य निर्भरता संपत्ति के डिफ़ॉल्ट UpdateSourceTrigger मान देता है:

फिर, मैं इस पाया। हालांकि, अधिकांश निर्भरता गुणों के लिए डिफ़ॉल्ट मान PropertyChanged है, जबकि टेक्स्ट प्रॉपर्टी में LostFocus का डिफ़ॉल्ट मान है।

इस प्रकार, यदि आप IsReadOnly = "सही" संपत्ति के साथ पाठ बॉक्स है, तो आप बाध्यकारी बयान करने के लिए एक UpdateSourceTrigger = PropertyChanged मूल्य जोड़ने के लिए:

<TextBox Text={Binding Source={x:Static p:Settings.Default}, Path=myTextSetting, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged} ... /> 
+0

सर्वोत्तम अभ्यास इस तरह से करना है, imho। – Will

8

मामले में आप एक वीबी हैं .NET डेवलपर इसका प्रयास कर रहा है, इसका जवाब एक स्मीज अलग है।

xmlns:p="clr-namespace:ThisApplication" 

ध्यान दें। प्रॉपर्टीज वहां नहीं है।


अपने यह बाध्यकारी में, MySettings.Default है Settings.Default के बजाय - app.config भंडार के बाद से इसे दूसरे तरीके से।

<TextBlock Height={Binding Source={x:Static p:MySettings.Default}, Path=Height, ... 

मेरे बालों को खींचने के बाद, मुझे यह पता चला। आशा है कि यह

2

में मदद करता है मैं ViewModel के माध्यम से यह करने के लिए पसंद है और (अन्य उत्तर देखें) कम है सिर्फ XAML

public Boolean Value 
    { 
     get 
     { 
      return Settings.Default.Value; 

     } 
     set 
     { 
      Settings.Default.SomeValue= value; 
      Settings.Default.Save(); 
      Notify("SomeValue"); 
     } 
    } 
+0

मुझे लगता है कि यह ज्यादातर मामलों के लिए सबसे अच्छा समाधान है, क्योंकि यह स्थिरता को लागू करता है। यदि यूआई सेटिंग्स से या कहीं और से आता है तो यूआई के लिए कोई फर्क नहीं पड़ता है। – Florian