wpf
डेटा बाइंडिंग के साथ कस्टम UserControls बनाना
खोज…
टिप्पणियों
ध्यान दें कि एक UserControl एक नियंत्रण से बहुत अलग है। प्राथमिक अंतरों में से एक यह है कि एक UserControl XAML लेआउट फ़ाइल का उपयोग यह निर्धारित करने के लिए करता है कि कई व्यक्तिगत नियंत्रण कहां रखें। दूसरी ओर एक नियंत्रण, सिर्फ शुद्ध कोड है - कोई भी लेआउट फ़ाइल नहीं है। कुछ मायनों में, एक कस्टम नियंत्रण बनाना कस्टम UserControl बनाने की तुलना में अधिक प्रभावी हो सकता है।
कस्टम डिफ़ॉल्ट पाठ के साथ कॉम्बो बॉक्स
यह कस्टम UserControl एक नियमित कॉम्बोक्स के रूप में दिखाई देगा, लेकिन बिल्ट-इन कॉम्बो बॉक्स ऑब्जेक्ट के विपरीत, यह उपयोगकर्ता को पाठ का डिफ़ॉल्ट स्ट्रिंग दिखा सकता है यदि उन्होंने अभी तक चयन नहीं किया है।
इसे पूरा करने के लिए, हमारा UserControl दो नियंत्रणों से बना होगा। जाहिर है हमें एक वास्तविक कॉम्बो बॉक्स की आवश्यकता है, लेकिन हम डिफ़ॉल्ट टेक्स्ट दिखाने के लिए एक नियमित लेबल का भी उपयोग करेंगे।
CustomComboBox.xaml
<UserControl x:Class="UserControlDemo.CustomComboBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cnvrt="clr-namespace:UserControlDemo"
x:Name="customComboBox">
<UserControl.Resources>
<cnvrt:InverseNullVisibilityConverter x:Key="invNullVisibleConverter" />
</UserControl.Resources>
<Grid>
<ComboBox x:Name="comboBox"
ItemsSource="{Binding ElementName=customComboBox, Path=MyItemsSource}"
SelectedItem="{Binding ElementName=customComboBox, Path=MySelectedItem}"
HorizontalContentAlignment="Left" VerticalContentAlignment="Center"/>
<Label HorizontalAlignment="Left" VerticalAlignment="Center"
Margin="0,2,20,2" IsHitTestVisible="False"
Content="{Binding ElementName=customComboBox, Path=DefaultText}"
Visibility="{Binding ElementName=comboBox, Path=SelectedItem, Converter={StaticResource invNullVisibleConverter}}"/>
</Grid>
</UserControl>
जैसा कि आप देख सकते हैं, यह एकल UserControl वास्तव में दो व्यक्तिगत नियंत्रणों का समूह है। यह हमें कुछ लचीलापन देता है जो अकेले कॉम्बो बॉक्स में उपलब्ध नहीं है।
यहां ध्यान देने योग्य कई महत्वपूर्ण बातें हैं:
- UserControl में एक
x:Name
सेट है। ऐसा इसलिए है क्योंकि हम उन संपत्तियों से जुड़ना चाहते हैं जो कोड-पीछे स्थित हैं, जिसका अर्थ है कि इसे स्वयं को संदर्भित करने के लिए किसी तरह की आवश्यकता है। - ComboBox पर बाध्यकारी प्रत्येक में UserControl का नाम
ElementName
। यह इसलिए है ताकि बाइंडिंग का पता लगाने के लिए UserControl खुद को देखना जानता हो। - लेबल हिट-टेस्ट दृश्यमान नहीं है। यह उपयोगकर्ता को यह भ्रम देना है कि लेबल कॉम्बो बॉक्स का हिस्सा है।
IsHitTestVisible=false
सेट करके, हम उपयोगकर्ता कोIsHitTestVisible=false
करने या लेबल पर क्लिक करने सेIsHitTestVisible=false
- सभी इनपुट इसके माध्यम से नीचे ComboBox में जाते हैं। - यह निर्धारित करने के लिए लेबल एक
InverseNullVisibility
कनवर्टर का उपयोग करता है कि यह खुद को दिखाना चाहिए या नहीं। आप इस उदाहरण के निचले भाग में इसके लिए कोड पा सकते हैं।
CustomComboBox.xaml.cs
public partial class CustomComboBox : UserControl
{
public CustomComboBox()
{
InitializeComponent();
}
public static DependencyProperty DefaultTextProperty =
DependencyProperty.Register("DefaultText", typeof(string), typeof(CustomComboBox));
public static DependencyProperty MyItemsSourceProperty =
DependencyProperty.Register("MyItemsSource", typeof(IEnumerable), typeof(CustomComboBox));
public static DependencyProperty SelectedItemProperty =
DependencyProperty.Register("SelectedItem", typeof(object), typeof(CustomComboBox));
public string DefaultText
{
get { return (string)GetValue(DefaultTextProperty); }
set { SetValue(DefaultTextProperty, value); }
}
public IEnumerable MyItemsSource
{
get { return (IEnumerable)GetValue(MyItemsSourceProperty); }
set { SetValue(MyItemsSourceProperty, value); }
}
public object MySelectedItem
{
get { return GetValue(MySelectedItemProperty); }
set { SetValue(MySelectedItemProperty, value); }
}
}
कोड-पीछे में, हम केवल यह बता रहे हैं कि हम इस UserControl का उपयोग करके कौन से गुण प्रोग्रामर को उपलब्ध कराना चाहते हैं। दुर्भाग्य से, क्योंकि हम इस वर्ग के बाहर से ComboBox के लिए सीधी पहुँच नहीं है, हम डुप्लिकेट गुण (बेनकाब करने के लिए की जरूरत है MyItemsSource
ComboBox के लिए ItemsSource
, उदाहरण के लिए)। हालाँकि, यह एक मामूली व्यापार है, इस पर विचार करते हुए कि अब हम इसे एक देशी नियंत्रण के समान उपयोग कर सकते हैं।
यहां बताया गया है कि CustomComboBox
UserControl का उपयोग कैसे किया जा सकता है:
<Window x:Class="UserControlDemo.UserControlDemo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cntrls="clr-namespace:UserControlDemo"
Title="UserControlDemo" Height="240" Width=200>
<Grid>
<cntrls:CustomComboBox HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="165"
MyItemsSource="{Binding Options}"
MySelectedItem="{Binding SelectedOption, Mode=TwoWay}"
DefaultText="Select an option..."/>
<Grid>
</Window>
और अंतिम परिणाम:
यहाँ UserControl पर लेबल के लिए आवश्यक InverseNullVisibilityConverter है, जो कि lll के संस्करण पर बस थोड़ा सा बदलाव है:
public class InverseNullVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == null ? Visibility.Visible : Visibility.Hidden;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}