2008-09-24 7 views
12

मैं एक आने वाले बाध्य पूर्णांक पर निरंतर मान जोड़ना चाहता हूं। असल में मेरे पास कई जगहें हैं जहां मैं एक ही स्रोत मूल्य से जुड़ना चाहता हूं लेकिन विभिन्न स्थिरांक जोड़ना चाहता हूं। तो आदर्श समाधान कुछ इस तरह होगा ...सरल अंकगणितीय ऑपरेशन के साथ WPF डेटा बाइंडिंग?

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=5}"/> 
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=8}"/> 
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myInt, Constant=24}"/> 

(नोट: यह विचार को दिखाने के लिए एक उदाहरण है, मेरे वास्तविक बाध्यकारी परिदृश्य किसी पाठ बॉक्स के कैनवास संपत्ति के लिए नहीं है लेकिन इस विचार को दर्शाता है। अधिक स्पष्ट रूप से)

इस समय एकमात्र समाधान मैं सोच सकता हूं कि कई अलग-अलग स्रोत गुणों का खुलासा करना है जिनमें से प्रत्येक एक ही आंतरिक मूल्य पर एक अलग स्थिरता को जोड़ता है। तो मैं इस तरह कुछ कर सकते हैं ...

<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus5}"/> 
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus8}"/> 
<TextBox Canvas.Top="{Binding ElementName=mySource, Path=myIntPlus24}"/> 

लेकिन यह बहुत गंभीर है क्योंकि भविष्य में मैं नए स्थिरांक के लिए नई प्रॉपर्टी जोड़ने रखने की जरूरत हो सकती है। अगर मुझे मूल्य वर्धित करने की ज़रूरत है तो मुझे स्रोत ऑब्जेक्ट को बदलने की ज़रूरत है जो कि सुंदर नफ है।

इससे कहीं अधिक सामान्य तरीका होना चाहिए? किसी भी डब्ल्यूपीएफ विशेषज्ञों को कोई विचार है?

उत्तर

6

मेरा मानना ​​है कि आप इसे मूल्य कनवर्टर के साथ कर सकते हैं। यहां एक blog entry है जो xaml में मान कनवर्टर को पैरामीटर पास करने वाले पते को संबोधित करता है। और this blog मूल्य कनवर्टर को लागू करने के कुछ विवरण देता है।

+0

तथ्य मूल्य कनवर्टर एक पैरामीटर ले जा सकते हैं लगता है के रूप में और अधिक उन्नत arithmatic संचालन के साथ उपयोग कर सकते हैं यहां समस्या को हल करने के लिए एक अच्छा दृष्टिकोण की तरह। इनपुट के लिए धन्यवाद। –

0

मैंने कभी भी WPF का उपयोग नहीं किया है, लेकिन मेरे पास एक संभावित समाधान है।

क्या आपका बाध्यकारी पथ मानचित्र मानचित्र पर जा सकता है? यदि ऐसा है, तो यह एक तर्क (कुंजी) लेने में सक्षम होना चाहिए। आपको एक क्लास बनाने की आवश्यकता होगी जो मैप इंटरफ़ेस लागू करता है, लेकिन वास्तव में केवल मूल मान देता है जिसे आपने कुंजी में जोड़े गए "मानचित्र" को प्रारंभ किया है।

public Integer get(Integer key) { return baseInt + key; } // or some such 

टैग से नंबर पारित करने के लिए कुछ क्षमता के बिना, मैं आप इसे कैसे मूल मूल्य से अलग डेल्टा वापस जाने के लिए प्राप्त करने के लिए जा रहे हैं नहीं दिख रहा।

4

एक मूल्य कनवर्टर का उपयोग करना समस्या का एक अच्छा समाधान है क्योंकि यह आपको स्रोत मान को संशोधित करने की अनुमति देता है क्योंकि यह यूआई के लिए बाध्य है।

मैंने कुछ स्थानों में निम्नलिखित का उपयोग किया है।

public class AddValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     object result = value; 
     int parameterValue; 

     if (value != null && targetType == typeof(Int32) && 
      int.TryParse((string)parameter, 
      NumberStyles.Integer, culture, out parameterValue)) 
     { 
      result = (int)value + (int)parameterValue; 
     } 

     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

उदाहरण

<Setter Property="Grid.ColumnSpan" 
     Value="{Binding 
        Path=ColumnDefinitions.Count, 
        RelativeSource={RelativeSource AncestorType=Grid}, 
        Converter={StaticResource addValueConverter}, 
        ConverterParameter=1}" 
    /> 
18

मैं एक MathConverter है कि मैं के साथ सभी सरल arithmatic आपरेशन करने के लिए बनाया का उपयोग करें। कनवर्टर के लिए कोड here है और यह इस तरह इस्तेमाल किया जा सकता:

<TextBox Canvas.Top="{Binding SomeValue, 
      Converter={StaticResource MathConverter}, 
      [email protected]+5}" /> 

तुम भी इस तरह के

Width="{Binding ElementName=RootWindow, Path=ActualWidth, 
       Converter={StaticResource MathConverter}, 
       ConverterParameter=((@VALUE-200)*.3)}" 
+0

अच्छा कनवर्टर, लेकिन यह मान तोड़ता है यदि मान एक नकारात्मक संख्या है। एक त्वरित हैक-वर्कअराउंड कम से कम किसी अन्य चिह्न का उपयोग करना होगा, क्रमशः "-" और मैथकॉन्टर के कोड में ऑपरेंड की सूचियों को संशोधित नहीं करेगा। पाठ्यक्रम के वास्तविक समाधान को पार्सिंग के दौरान और तर्क जोड़ने की आवश्यकता होगी .. –

+0

@MaximZabolotskikh एक ऋणात्मक संख्या केवल '0 - @ VALUE' है, इसलिए उपयोगकर्ता इसे आसानी से दर्ज कर सकते हैं। या एक बेहतर समाधान के रूप में, जब हम संख्यात्मक टोकन की अपेक्षा करते हैं, तो बस एक '-' प्रतीक की जांच करें, और यदि यह पाई जाती है तो इसे ठीक से पार्स करें। मुझे लगता है कि मैंने वास्तव में ऐसा किया होगा कि कनवर्टर की प्रति में मैं अपनी डब्ल्यूपीएफ लाइब्रेरी में रखता हूं ... – Rachel

+0

0 - @VALUE काम नहीं करेगा। अधिक सटीक होने के लिए, मेरे पास 0-आधारित सूची है और टेक्स्ट "तत्व x का वाई" दिखाना चाहता हूं, इसलिए मैं इंडेक्स (x) को "@VALUE + 1" के रूप में बांधता हूं। हालांकि खाली सूची -1 सूचकांक के रूप में वापस आ जाएगी, इसलिए यह -1 + 1 बन जाता है, मैककॉन्टर ऑपरेटर द्वारा विभाजित होता है, शून्य से दूसरे नंबर की तुलना में नहीं मिलता है, ऐसा लगता है। तो कुछ और पार्सिंग किया जाना चाहिए। लेकिन मूल रूप से मेरी टिप्पणी का उद्देश्य किसी भी व्यक्ति को संभावित समस्या का समाधान करना था जो भविष्य में इस कोड का उपयोग कर सकता है। यह वैसे भी एक सहायक कनवर्टर है। –