बेमेल प्रकारों के साथ डेटा बाइंडिंग
कभी-कभी आपके द्वारा उपयोग किया जा रहा डेटा डेटा प्रदर्शित करने वाले नियंत्रण गुण के डेटा प्रकार से मेल नहीं खाता है. उदाहरण के लिए, आपके पास decimal
प्रकार में संग्रहीत मौद्रिक मान हो सकता है जिसे आप मुद्रा के रूप में स्वरूपित Label
नियंत्रण पर प्रदर्शित करना चाहते हैं. एक अधिक जटिल उदाहरण मॉड्यूल में प्रस्तुत मौसम ऐप के साथ होगा। एक छवि को मौसम पूर्वानुमान के Sunny
या Cloudy
गणना मान के आधार पर प्रदर्शित किया जाना चाहिए, लेकिन आप स्रोत के गणना मान को लक्ष्य की छवि संपत्ति से बाध्य नहीं कर सकते। यह इकाई उन तरीकों को देखती है जिनसे आप डेटा परिवर्तित कर सकते हैं।
स्ट्रिंग स्वरूपण
एक सामान्य प्रकार बेमेल एक आंतरिक प्रकार है जिसे आप स्वरूपित स्ट्रिंग के रूप में प्रदर्शित करना चाहते हैं। जैसे जब आप किसी DateTime
मान के भागों को प्रदर्शित करना चाहते हैं, या आप किसी decimal
प्रकार को मुद्रा के रूप में स्वरूपित करना चाहते हैं.
मान लें कि आप किसी बिल पर देय राशि प्रदर्शित करना चाहते हैं और आपके डेटा ऑब्जेक्ट पर यह गुण है:
public decimal BillAmount { get; set; }
बकाया राशि 22.0304 समाप्त होती है। आप कुछ पाठ और डॉलर राशि प्रदर्शित करने के लिए दो लेबल नियंत्रणों का उपयोग कर सकते हैं, जैसा कि निम्न स्निपेट में दिखाया गया है:
<HorizontalStackLayout>
<Label Text="You owe" Margin="0,0,5,0" />
<Label Text="{Binding BillAmount}" />
<Label Text="to the bank" Margin="5,0,0,0" />
</HorizontalStackLayout>
यह UI के लिए एक स्ट्रिंग आउटपुट करता है जो You owe 22.0304 to the bank
जैसा दिखता है, लेकिन इसमें मुद्रा प्रतीक गायब है और स्थानीय मुद्रा के आधार पर बहुत अधिक या बहुत कम दशमलव स्थान हो सकते हैं। आम तौर पर आप कोड में "सी" (या मुद्रा) प्रारूप विनिर्देशक के साथ स्ट्रिंग के रूप में मान को संसाधित करेंगे, जैसे:
string formattedBillAmount = string.Format("{0:C}", BillAmount);
लेकिन डेटा बाइंडिंग में स्वरूपण का उपयोग करने के लिए, आपको या तो डेटा ऑब्जेक्ट को आपको उस स्वरूपित स्ट्रिंग को एक अलग संपत्ति के रूप में प्रदान करना होगा, या इसे किसी भी तरह से अवरोधित करना होगा और इसे स्वयं स्वरूपित करना होगा। सौभाग्य से, .NET MAUI बाइंडिंग StringFormat
बाइंडिंग गुण के साथ स्ट्रिंग्स स्वरूपित करने के लिए एक तरीका प्रदान करते हैं। स्वरूप स्ट्रिंग String.Format
विधि के समान नियमों का पालन करती है. एकल उद्धरणों में प्रारूप स्ट्रिंग संलग्न करें ताकि एक्सएएमएल पार्सर घुंघराले ब्रेसिज़ से भ्रमित न हो। स्ट्रिंग स्वरूप पैरामीटर 0
बाइंडिंग द्वारा संसाधित गुण मान है।
<Label Text="{Binding BillAmount, StringFormat='You owe {0:C} to the bank'}" />
निम्न XAML पर विचार करें, जो दोनों तरीकों का उपयोग करके BillAmount
प्रदर्शित करना प्रदर्शित करता है:
<VerticalStackLayout Padding="10">
<HorizontalStackLayout>
<Label Text="You owe" Margin="0,0,5,0" />
<Label Text="{Binding BillAmount}" />
<Label Text="to the bank" Margin="5,0,0,0" />
</HorizontalStackLayout>
<HorizontalStackLayout>
<Label Text="{Binding BillAmount, StringFormat='You owe {0:C} to the bank'}" />
</HorizontalStackLayout>
</VerticalStackLayout>
निम्न छवि दर्शाती है कि XAML आउटपुट स्क्रीन पर क्या उत्पन्न करता है:
StringFormat
बाइंडिंग गुण का उपयोग करने वाला XAML अन्य XAML की तुलना में सरल है, और आपके पास . नेट की शक्तिशाली स्ट्रिंग स्वरूपण प्रणाली।
कस्टम प्रकार रूपांतरण
स्ट्रिंग के रूप में मान प्रदर्शित करते समय StringFormat
बाइंडिंग गुण सुविधाजनक होता है, लेकिन तब नहीं जब आप किसी अन्य प्रकार से Color
या Image
जैसी किसी चीज़ को कनवर्ट करना चाहते हैं। इन मामलों में, आपको कस्टम रूपांतरण कोड लिखना होगा।
मान लीजिए कि आप उपयोगकर्ता को पासवर्ड चुनने के लिए संकेत दे रहे हैं, और आप पासवर्ड की ताकत को इंगित करने के लिए यूआई में एक रंग का उपयोग करना चाहते हैं। ताकत के तीन स्तर हैं: कमजोर, अच्छा, मजबूत। ताकत इस बात पर आधारित है कि पासवर्ड में कितने अक्षर हैं। उपयोगकर्ता को उनकी पासवर्ड शक्ति के बारे में तत्काल प्रतिक्रिया देने के लिए, आप चाहते हैं कि पासवर्ड वाले Entry
नियंत्रण की पृष्ठभूमि को ताकत के आधार पर बदला जाए। निम्न छवि ताकत के उन तीन स्तरों को प्रदर्शित करती है: कमजोर, अच्छा और मजबूत।
स्क्रीनशॉट में तीन प्रविष्टि नियंत्रणों में से, पहले में चार वर्ण दर्ज किए गए हैं और एक लाल पृष्ठभूमि है। दूसरे में नौ वर्ण दर्ज किए गए हैं और इसमें पीले रंग की पृष्ठभूमि है। अंतिम प्रविष्टि नियंत्रण में 15 वर्ण हैं और इसमें एक नीली पृष्ठभूमि है।
इन स्तरों को Strength
गणना के लिए सौंपा गया है:
private enum Strength
{
Weak,
Good,
Strong
}
एक डेटा ऑब्जेक्ट को पृष्ठ के BindingContext
के रूप में असाइन किया गया है, जिसमें PasswordStrength
संपत्ति के साथ पासवर्ड की ताकत होती है। जैसे ही उपयोगकर्ता पासवर्ड टाइप करता है, पासवर्ड की लंबाई के अनुसार PasswordStrength
गुण बदल जाता है। डेटा ऑब्जेक्ट PasswordStrength
गुण है, क्योंकि आप उस गुण Entry
नियंत्रण के BackgroundColor
करने के लिए बाइंड करें:
<Entry BackgroundColor="{Binding PasswordStrength} ... />
हालांकि यहां एक समस्या है।
PasswordStrength
टाइप Strength
का है जबकि BackgroundColor
एक Color
है। ये प्रकार एक दूसरे के साथ संगत नहीं हैं। .NET MAUI इन प्रकार-बेमेल समस्याओं, बाइंडिंग के Converter
गुण को ठीक करने का एक तरीका प्रदान करता है।
एक बाध्यकारी कनवर्टर वही करता है जो उसका नाम कहता है, बाध्यकारी स्रोत और लक्ष्य के बीच परिवर्तित होता है। कन्वर्टर्स IValueConverter
इंटरफ़ेस के माध्यम से कार्यान्वित किए जाते हैं।
लागू करें IValueConverter
आप अपने रूपांतरण तर्क को एक ऐसे वर्ग में बनाते हैं जो IValueConverter
इंटरफ़ेस लागू करता है। आमतौर पर, इन वर्गों के नाम अपने उद्देश्य को स्पष्ट करने के लिए Converter
नाम के साथ समाप्त होते हैं।
IValueConverter
इंटरफ़ेस दो विधियों को परिभाषित करता है:
Convert
—बाइंडिंग स्रोत की प्रॉपर्टी से बाइंडिंग टारगेट की UI प्रॉपर्टी में कनवर्ट करता है.ConvertBack
—बाइंडिंग टारगेट की UI प्रॉपर्टी से वापस बाइंडिंग सोर्स की प्रॉपर्टी में कनवर्ट करता है.इस विधि का उपयोग शायद ही कभी किया जाता है और इस परिदृश्य में इसका उपयोग नहीं किया जाता है। अधिकांश कन्वर्टर्स यह इंगित करने के लिए एक
NotSupportedException
देते हैं कि यह रूपांतरण समर्थित नहीं है।
यहाँ इंटरफ़ेस का अनुबंध है:
public interface IValueConverter
{
object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture);
object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture);
}
याद रखें कि जिस परिदृश्य के साथ हम काम कर रहे हैं वह Entry.BackgroundColor
संपत्ति को डेटा ऑब्जेक्ट की PasswordStrength
संपत्ति से बांध रहा है, जो एक Strength
गणना है।
<Entry BackgroundColor="{Binding PasswordStrength} ... />
Strength
गणना को Color
में बदलने की जरूरत है। तो कनवर्टर को मूल्यांकन करने की आवश्यकता है कि कौन सा Strength
मूल्य प्रदान किया गया है, और एक अलग Color
लौटाएं। निम्न कोड इस कनवर्ज़न को प्रदर्शित करता है:
namespace MyProject.Converters;
class StrengthToColorConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
return (Strength)value! switch
{
Strength.Weak => Colors.OrangeRed,
Strength.Good => Colors.Yellow,
Strength.Strong => Colors.LightBlue,
_ => Colors.LightBlue
};
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) =>
throw new NotImplementedException();
}
आइए इस कोड को तोड़ें:
-
Convert
विधि में चार पैरामीटर हैं। आप आम तौर पर अंतिम दो मापदंडों को छोड़ सकते हैं जब तक कि आपके पास उनका उपयोग करने का कोई विशिष्ट कारण न हो। -
value
पैरामीटर में आवक मान है। इस उदाहरण में, यह एकStrength
गणना मान है। -
targetType
पैरामीटर पर ध्यान नहीं दिया है। लेकिन आप इस पैरामीटर का उपयोग यह सत्यापित करने के लिए कर सकते हैं कि कनवर्टर के साथ जिस प्रकार की संपत्ति का उपयोग किया जा रहा है वह एकColor
है। यह सादगी के लिए इस उदाहरण में छोड़ दिया गया है। -
Strength
मान के आधार पर एक अलग रंग वापस करने के लिए एक स्विच अभिव्यक्ति का उपयोग किया जाता है।
XAML में कनवर्टर का उपयोग करें
कनवर्टर क्लास बनाए जाने के साथ, आपको इसका एक उदाहरण बनाने और इसे बाइंडिंग में संदर्भित करने की आवश्यकता है। कनवर्टर को तत्काल करने का मानक तरीका मूल तत्व के संसाधन शब्दकोश में है।
पहले, किसी XML नामस्थान को उस .NET नामस्थान से मैप करें जिसमें कनवर्टर है. निम्न कोड उदाहरण में, cvt
XML नामस्थान MyProject.Converters
.NET नामस्थान के लिए मैप:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:cvt="clr-namespace:MyProject.Converters"
...
इसके बाद, ContentPage.Resources
में एक उदाहरण बनाएं:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:cvt="clr-namespace:MyProject.Converters"
x:Class="MyProject.PasswordExample">
<ContentPage.Resources>
<cvt:StrengthToColorConverter x:Key="StrengthToColorConverter" />
</ContentPage.Resources>
अब कनवर्टर का एक उदाहरण कुंजी StrengthToColorConverter
के साथ संसाधन शब्दकोश में है, जो प्रकार के समान नाम होता है। यह कन्वर्टर्स के नामकरण का एक विशिष्ट तरीका है, क्योंकि आपके पास आम तौर पर केवल एक ही कनवर्टर होता है जिसे आप पूरे एक्सएएमएल में पुन: उपयोग करते हैं। यदि आपको, किसी कारण से, कई कनवर्टर उदाहरणों की आवश्यकता होती है, तो कुंजियों को उनके बीच भिन्न होना होगा।
अंत में, बाइंडिंग पर कनवर्टर का संदर्भ लें। चूंकि कनवर्टर एक संसाधन शब्दकोश में है, इसलिए आप इसे संदर्भित करने के लिए {StaticResource}
मार्कअप एक्सटेंशन का उपयोग करते हैं। कनवर्टर को Converter
बाइंडिंग प्रॉपर्टी को सौंपा गया है:
<Entry BackgroundColor="{Binding PasswordStrength, Converter={StaticResource StrengthToColorConverter}}" ... />