wpf
मूल्य और बहुवर्णी कन्वर्टर्स
खोज…
पैरामीटर
पैरामीटर | विवरण |
---|---|
मूल्य | बाध्यकारी स्रोत द्वारा उत्पादित मूल्य। |
मान | बाइंडिंग सोर्स द्वारा निर्मित वैल्यू ऐरे। |
TargetType | बाध्यकारी लक्ष्य संपत्ति का प्रकार। |
पैरामीटर | कनवर्टर पैरामीटर का उपयोग करने के लिए। |
संस्कृति | कनवर्टर में उपयोग करने की संस्कृति। |
टिप्पणियों
क्या IValueConverter और IMultiValueConverterthey हैं
IValueConverter और IMultiValueConverter - इंटरफेस जो एक बाध्यकारी करने के लिए एक कस्टम तर्क को लागू करने का एक तरीका प्रदान करता है।
वे किसके लिए उपयोगी हैं
- आपके पास कुछ प्रकार का मूल्य है, लेकिन आप एक तरह से शून्य मान दिखाना चाहते हैं और दूसरे तरीके से सकारात्मक संख्या
- आपके पास कुछ प्रकार का मूल्य है और एक मामले में तत्व दिखाना चाहते हैं और दूसरे में छिपाना चाहते हैं
- आपके पास पैसे का एक संख्यात्मक मूल्य है लेकिन इसे शब्दों के रूप में दिखाना चाहते हैं
- आपके पास एक संख्यात्मक मान है लेकिन विभिन्न संख्याओं के लिए अलग-अलग चित्र दिखाना चाहते हैं
ये कुछ साधारण मामले हैं, लेकिन कई और भी हैं।
इस तरह के मामलों के लिए, आप एक मान कनवर्टर का उपयोग कर सकते हैं। ये छोटे वर्ग, जो IValueConverter इंटरफ़ेस या IMultiValueConverter को लागू करते हैं, बिचौलियों की तरह काम करेंगे और स्रोत और गंतव्य के बीच एक मूल्य का अनुवाद करेंगे। इसलिए, किसी भी स्थिति में जहां आपको अपने गंतव्य तक पहुंचने से पहले या फिर अपने स्रोत पर वापस जाने से पहले एक मूल्य को बदलने की आवश्यकता होती है, आपको संभवतः एक कनवर्टर की आवश्यकता होती है।
बिल्ड-इन बूलियनट्विसिबिलिटी कंवर्टर [IValueConverter]
बूलियन और दृश्यता के बीच कनवर्टर। इनपुट पर bool
मूल्य प्राप्त करें और Visibility
मान Visibility
।
नोट: यह कन्वर्टर पहले से ही System.Windows.Controls
में मौजूद है।
public sealed class BooleanToVisibilityConverter : IValueConverter
{
/// <summary>
/// Convert bool or Nullable bool to Visibility
/// </summary>
/// <param name="value">bool or Nullable bool</param>
/// <param name="targetType">Visibility</param>
/// <param name="parameter">null</param>
/// <param name="culture">null</param>
/// <returns>Visible or Collapsed</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool bValue = false;
if (value is bool)
{
bValue = (bool)value;
}
else if (value is Nullable<bool>)
{
Nullable<bool> tmp = (Nullable<bool>)value;
bValue = tmp.HasValue ? tmp.Value : false;
}
return (bValue) ? Visibility.Visible : Visibility.Collapsed;
}
/// <summary>
/// Convert Visibility to boolean
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
return (Visibility)value == Visibility.Visible;
}
else
{
return false;
}
}
}
कनवर्टर का उपयोग करना
- संसाधन को परिभाषित करें
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
- इसे बंधन में प्रयोग करें
<Button Visibility="{Binding AllowEditing,
Converter={StaticResource BooleanToVisibilityConverter}}"/>
संपत्ति के साथ कनवर्टर [IValueConverter]
संपत्ति के माध्यम से पैरामीटर के साथ सरल कनवर्टर बनाने का तरीका दिखाएं और फिर घोषणा में इसे पास करें। bool
मान को Visibility
कनवर्ट करें। स्थापना करके परिणाम मूल्य की विपरीत अनुमति दें Inverted
करने के लिए संपत्ति True
।
public class BooleanToVisibilityConverter : IValueConverter
{
public bool Inverted { get; set; }
/// <summary>
/// Convert bool or Nullable bool to Visibility
/// </summary>
/// <param name="value">bool or Nullable bool</param>
/// <param name="targetType">Visibility</param>
/// <param name="parameter">null</param>
/// <param name="culture">null</param>
/// <returns>Visible or Collapsed</returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool bValue = false;
if (value is bool)
{
bValue = (bool)value;
}
else if (value is Nullable<bool>)
{
Nullable<bool> tmp = (Nullable<bool>)value;
bValue = tmp ?? false;
}
if (Inverted)
bValue = !bValue;
return (bValue) ? Visibility.Visible : Visibility.Collapsed;
}
/// <summary>
/// Convert Visibility to boolean
/// </summary>
/// <param name="value"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns>True or False</returns>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
return ((Visibility) value == Visibility.Visible) && !Inverted;
}
return false;
}
}
कनवर्टर का उपयोग करना
- नाम स्थान को परिभाषित करें
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
- संसाधन को परिभाषित करें
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityInvertedConverter"
Inverted="False"/>
- इसे बंधन में प्रयोग करें
<Button Visibility="{Binding AllowEditing, Converter={StaticResource BoolToVisibilityConverter}}"/>
सरल जोड़ें कनवर्टर [IMultiValueConverter]
दिखाएँ सरल बनाने का तरीका IMultiValueConverter
कनवर्टर और का उपयोग MultiBinding
XAML में। values
सरणी द्वारा पास किए गए सभी मानों का योग प्राप्त करें।
public class AddConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
decimal sum = 0M;
foreach (string value in values)
{
decimal parseResult;
if (decimal.TryParse(value, out parseResult))
{
sum += parseResult;
}
}
return sum.ToString(culture);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
कनवर्टर का उपयोग करना
- नाम स्थान को परिभाषित करें
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
- संसाधन को परिभाषित करें
<converters:AddConverter x:Key="AddConverter"/>
- इसे बंधन में प्रयोग करें
<StackPanel Orientation="Vertical">
<TextBox x:Name="TextBox" />
<TextBox x:Name="TextBox1" />
<TextBlock >
<TextBlock.Text>
<MultiBinding Converter="{StaticResource AddConverter}">
<Binding Path="Text" ElementName="TextBox"/>
<Binding Path="Text" ElementName="TextBox1"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
कन्वर्टरपैरमीटर के साथ उपयोग कन्वर्टर्स
दिखाएँ कि कैसे सरल कनवर्टर बनाने के लिए और ConverterParameter
पैरामीटर का उपयोग करके ConverterParameter
को पैरामीटर पास करें। गुणांक द्वारा गुणक को कनवर्टरपैरमीटर में पारित किया जाता है।
public class MultiplyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return 0;
if (parameter == null)
parameter = 1;
double number;
double coefficient;
if (double.TryParse(value.ToString(), out number) && double.TryParse(parameter.ToString(), out coefficient))
{
return number * coefficient;
}
return 0;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
कनवर्टर का उपयोग करना
- नाम स्थान को परिभाषित करें
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
- संसाधन को परिभाषित करें
<converters:MultiplyConverter x:Key="MultiplyConverter"/>
- इसे बंधन में प्रयोग करें
<StackPanel Orientation="Vertical">
<TextBox x:Name="TextBox" />
<TextBlock Text="{Binding Path=Text,
ElementName=TextBox,
Converter={StaticResource MultiplyConverter},
ConverterParameter=10}"/>
</StackPanel>
समूह के कई कन्वर्टर्स [IValueConverter]
यह कन्वर्टर एक साथ कई कन्वर्टर्स को चेन करेगा।
public class ValueConverterGroup : List<IValueConverter>, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
इस उदाहरण में, से बूलियन परिणाम EnumToBooleanConverter
में इनपुट के रूप में प्रयोग किया जाता है BooleanToVisibilityConverter
।
<local:ValueConverterGroup x:Key="EnumToVisibilityConverter">
<local:EnumToBooleanConverter/>
<local:BooleanToVisibilityConverter/>
</local:ValueConverterGroup>
बटन तभी दिखाई देगा जब CurrentMode
प्रॉपर्टी Ready
सेट Ready
।
<Button Content="Ok" Visibility="{Binding Path=CurrentMode, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static local:Mode.Ready}"/>
पुनरावर्ती घोषणा को छोड़ने के लिए कन्वर्टर्स के साथ मार्कअपटेक्स्ट का उपयोग करना
आमतौर पर कनवर्टर का उपयोग करने के लिए, हमें इसे निम्नलिखित तरीके से संसाधन के रूप में परिभाषित करना होगा:
<converters:SomeConverter x:Key="SomeConverter"/>
यह एक कदम को MarkupExtension
रूप में एक कनवर्टर को परिभाषित MarkupExtension
और ProvideValue
विधि को लागू करना ProvideValue
। निम्न उदाहरण एक मान को उसके ऋणात्मक में परिवर्तित करता है:
namespace MyProject.Converters
{
public class Converter_Negative : MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return this.ReturnNegative(value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return this.ReturnNegative(value);
}
private object ReturnNegative(object value)
{
object result = null;
var @switch = new Dictionary<Type, Action> {
{ typeof(bool), () => result=!(bool)value },
{ typeof(byte), () => result=-1*(byte)value },
{ typeof(short), () => result=-1*(short)value },
{ typeof(int), () => result=-1*(int)value },
{ typeof(long), () => result=-1*(long)value },
{ typeof(float), () => result=-1f*(float)value },
{ typeof(double), () => result=-1d*(double)value },
{ typeof(decimal), () => result=-1m*(decimal)value }
};
@switch[value.GetType()]();
if (result == null) throw new NotImplementedException();
return result;
}
public Converter_Negative()
: base()
{
}
private static Converter_Negative _converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null) _converter = new Converter_Negative();
return _converter;
}
}
}
कनवर्टर का उपयोग करना:
नाम स्थान को परिभाषित करें
xmlns: कन्वर्टर्स = "clr-नाम स्थान: MyProject.Converters; विधानसभा = MyProject"
बाध्यकारी में इस कनवर्टर का उदाहरण उपयोग
<RichTextBox IsReadOnly="{Binding Path=IsChecked, ElementName=toggleIsEnabled, Converter={converters:Converter_Negative}}"/>
एक आदेश में कई मापदंडों को पारित करने के लिए IMultiValueConverter का उपयोग करें
यह एक के रूप में कई बाध्य मान प्रदान करने के लिए संभव है CommandParameter
का उपयोग कर MultiBinding
एक बहुत ही सरल के साथ IMultiValueConverter
:
namespace MyProject.Converters
{
public class Converter_MultipleCommandParameters : MarkupExtension, IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.ToArray();
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
private static Converter_MultipleCommandParameters _converter = null;
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (_converter == null) _converter = new Converter_MultipleCommandParameters();
return _converter;
}
public Converter_MultipleCommandParameters()
: base()
{
}
}
}
कनवर्टर का उपयोग करना:
उदाहरण कार्यान्वयन - विधि जब कहा जाता
SomeCommand
निष्पादित किया जाता है (ध्यान दें:DelegateCommand
के एक कार्यान्वयन हैICommand
कि इस उदाहरण में प्रदान नहीं की है):private ICommand _SomeCommand; public ICommand SomeCommand { get { return _SomeCommand ?? (_SomeCommand = new DelegateCommand(a => OnSomeCommand(a))); } } private void OnSomeCommand(object item) { object[] parameters = item as object[]; MessageBox.Show( string.Format("Execute command: {0}\nParameter 1: {1}\nParamter 2: {2}\nParamter 3: {3}", "SomeCommand", parameters[0], parameters[1], parameters[2])); }
नाम स्थान को परिभाषित करें
xmlns: कन्वर्टर्स = "clr-नाम स्थान: MyProject.Converters; विधानसभा = MyProject"
बाध्यकारी में इस कनवर्टर का उदाहरण उपयोग
<Button Width="150" Height="23" Content="Execute some command" Name="btnTestSomeCommand" Command="{Binding Path=SomeCommand}" > <Button.CommandParameter> <MultiBinding Converter="{converters:Converter_MultipleCommandParameters}"> <Binding RelativeSource="{RelativeSource Self}" Path="IsFocused"/> <Binding RelativeSource="{RelativeSource Self}" Path="Name"/> <Binding RelativeSource="{RelativeSource Self}" Path="ActualWidth"/> </MultiBinding> </Button.CommandParameter> </Button>