2010-12-17 13 views
8

मुझे एक सूचीपिकर के साथ दो तरह से बाध्यकारी का उपयोग कर समस्या हो रही है। मैं C# का उपयोग कर मान सेट करने में सक्षम हूं लेकिन xaml में SelectedItem=".." में नहीं। बाध्यकारी सही मान लौटा रहा है (और सूची पिक्चर में एक मान है) क्योंकि मैंने पाठ को टेक्स्टब्लॉक में निर्दिष्ट करके इसे लिखा है।दो तरह बाध्यकारी सेटिंग्स समस्या

पृष्ठ लोड हो तो listpicker पर इस्तेमाल किया बंधन जब का कारण बनता है एक System.ArgumentOutOfRangeException

कोड मैं इसे स्थापित करने के लिए उपयोग कर रहा हूँ है:

<toolkit:ListPicker x:Name="WeekStartDay" 
        Header="Week begins on" 
        SelectedItem="{Binding Source={StaticResource AppSettings}, 
              Path=WeekBeginsSetting, 
              Mode=TwoWay}"> 
    <sys:String>monday</sys:String> 
    <sys:String>sunday</sys:String> 
</toolkit:ListPicker> 
:

// Update a setting value. If the setting does not exist, add the setting. 
    public bool AddOrUpdateValue(string key, Object value) 
    { 
     bool valueChanged = false; 

     try 
     { 
      // If new value is different, set the new value 
      if (settingsStorage[key] != value) 
      { 
       settingsStorage[key] = value; 
       valueChanged = true; 
      } 
     } 
     catch (KeyNotFoundException) 
     { 
      settingsStorage.Add(key, value); 
      valueChanged = true; 
     } 
     catch (ArgumentException) 
     { 
      settingsStorage.Add(key, value); 
      valueChanged = true; 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Exception occured whilst using IsolatedStorageSettings: " + e.ToString()); 
     } 

     return valueChanged; 
    } 


    // Get the current value of the setting, if not found, set the setting to default value. 
    public valueType GetValueOrDefault<valueType>(string key, valueType defaultValue) 
    { 
     valueType value; 

     try 
     { 
      value = (valueType)settingsStorage[key]; 
     } 
     catch (KeyNotFoundException) 
     { 
      value = defaultValue; 
     } 
     catch (ArgumentException) 
     { 
      value = defaultValue; 
     } 

     return value; 
    } 

    public string WeekBeginsSetting 
    { 
     get 
     { 
      return GetValueOrDefault<string>(WeekBeginsSettingKeyName, WeekBeginsSettingDefault); 
     } 
     set 
     { 
      AddOrUpdateValue(WeekBeginsSettingKeyName, value); 
      Save(); 
     } 
    } 

और XAML में

StaticResource AppSettings एक अलग .cs फ़ाइल से संसाधन है।

<phone:PhoneApplicationPage.Resources> 
    <local:ApplicationSettings x:Key="AppSettings"></local:ApplicationSettings> 
</phone:PhoneApplicationPage.Resources> 

अग्रिम

+0

जब आप '{StaticResource AppSettings} 'लिखते हैं तो आपका क्या मतलब है? क्या यह 'XAML' या 'स्थिर वर्ग' में कहीं भी 'संसाधन' का नाम है? – decyclone

+0

हाँ क्षमा करें मैं ऐपसेटिंग का उल्लेख करना भूल गया एक अलग वर्ग फ़ाइल – Jamie

+0

क्या यह एक स्थिर वर्ग है? क्या आप अपने मौजूदा बाध्यकारी के साथ '{x: स्टेटिक ऐपसेटिंग। वीकबैगिनसेटिंग} को भ्रमित कर रहे हैं? चूंकि सिल्वरलाइट '{x: स्टेटिक}' का समर्थन नहीं करता है। – decyclone

उत्तर

5

मैंने इस अपवाद के स्रोत को खोजने के लिए परावर्तक का उपयोग किया। ListPicker.cs में निम्न विधि ओवरराइड है।

protected override void OnItemsChanged(NotifyCollectionChangedEventArgs e) 

इस विधि में निम्न पंक्ति अपवाद का कारण होगा यदि SelectedItem सेट किया गया है और SelectedIndex है -1 (जब तक यह इससे पहले कि यह भरी हुई है सेट है जो यह है)। यदि चयनित इटैम सेट नहीं है तो यह लाइन कभी नहीं पहुंचती है (इसलिए कोई अपवाद नहीं)।

else if (!object.Equals(base.get_Items().get_Item(this.SelectedIndex), this.SelectedItem)) 

इस के आसपास काम करने के लिए (जब तक वे इसे ठीक नहीं करते) मेरे पास कुछ सुझाव हैं।

वर्कअराउंड 1

आप प्रारंभिक सूचकांक जो TwoWay बाध्यकारी तो आप SelectedIndex संपत्ति के रूप में अच्छी तरह से सेट कर सकते हैं और TwoWay बाइंडिंग काम करेंगे

<toolkit:ListPicker x:Name="WeekStartDay" 
        Header="Week begins on" 
        SelectedItem="{Binding Source={StaticResource AppSettings}, 
              Path=WeekBeginsSetting, 
              Mode=TwoWay}" 
        SelectedIndex="1"> 
    <sys:String>monday</sys:String> 
    <sys:String>sunday</sys:String> 
</toolkit:ListPicker> 

वर्कअराउंड द्वारा उत्पादन किया जाएगा पता है 2

लोड किए गए ईवेंट का उपयोग करें और इसके बजाय बाध्यकारी सेट करें

<toolkit:ListPicker x:Name="WeekStartDay" 
        Header="Week begins on" 
        Loaded="WeekStartDay_Loaded"> 
    <sys:String>monday</sys:String> 
    <sys:String>sunday</sys:String> 
</toolkit:ListPicker> 

private void WeekStartDay_Loaded(object sender, RoutedEventArgs e) 
{ 
    Binding binding = new Binding(); 
    binding.Source = this.Resources["AppSettings"] as ApplicationSettings; 
    binding.Path = new PropertyPath("WeekBeginsSetting"); 
    binding.Mode = BindingMode.TwoWay; 
    WeekStartDay.SetBinding(ListPicker.SelectedItemProperty, binding); 
} 
+0

thx। मुझे लगता है कि मैं वर्कअराउंड # 2 के साथ जाऊंगा। – Stan

0

धन्यवाद आप सक्रिय हो रहे हैं प्रासंगिक संपत्ति घटनाओं बदल?

सुनिश्चित करें कि चयनित इटैम के पास दो तरह का बाध्यकारी हो सकता है। अगर किसी आइटमकंटनर स्टाइल को परिभाषित करने का प्रयास न करें और IsSelected प्रॉपर्टी को अपनी ऑब्जेक्ट पर किसी संबंधित प्रॉपर्टी पर बाध्य करें। चयनित आइटम प्राप्त करना तब छोटा हो जाता है।

+0

ओह, मैं उस समस्या का जिक्र करना भूल गया जो सूची सूची में है, यह एक 'सिस्टम। ऑर्ग्यूमेंटऑटऑफरेंज एक्सेप्शन' – Jamie

0

यदि ऐपसेटिंग एक संग्रह है तो यह काम नहीं करेगा। आपको स्केलर वैल्यू पर SelectedItem बांधना होगा और दुर्भाग्य से WP7 पर "सिल्वरलाइट 3.7" बाइंडिंग में इंडेक्सर्स का समर्थन नहीं करता है।

इसके अलावा, अपने कार्यक्रम में प्रवाह नियंत्रण के रूप में अपवाद का इस्तेमाल करें नहीं है, बजाय कुछ इस तरह करते हैं: इसके बजाय बंधन मैं बस SelectedItem सेट, जब पेज लोड का उपयोग करने का

try 
    { 
     // If new value is different, set the new value 
     if(!settingsStorage.ContainsKey(key)) 
     { 
      settingsStorage.Add(key, value); 
      valueChanged = true; 
     } 
     else if(settingsStorage[key] != value) 
     { 
      settingsStorage[key] = value; 
      valueChanged = true; 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Exception occured whilst using IsolatedStorageSettings: " + e.ToString()); 
    } 
+0

धन्यवाद देता है, मैं चयनित इंडेक्स को काम करने के लिए प्राप्त कर सकता हूं लेकिन यह सिर्फ आइटम को हाइलाइट करता है और सूची पिकर होने पर इसे नहीं दिखाता है निष्क्रिय - इसके बजाय सूची पिकर में पहला मान दिखाता है। इस पर विस्तृत रूप के लिए – Jamie

0

और एक SelectionChanged घटना का इस्तेमाल किया बिना पुष्टि के मूल्य को अपडेट करने के लिए हैंडलर (एक सेव बटन रखना)।

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