खोज…


पैरामीटर

पैरामीटर विवरण
मूल्य बाध्यकारी स्रोत द्वारा उत्पादित मूल्य।
मान बाइंडिंग सोर्स द्वारा निर्मित वैल्यू ऐरे।
TargetType बाध्यकारी लक्ष्य संपत्ति का प्रकार।
पैरामीटर कनवर्टर पैरामीटर का उपयोग करने के लिए।
संस्कृति कनवर्टर में उपयोग करने की संस्कृति।

टिप्पणियों

क्या IValueConverter और IMultiValueConverterthey हैं

IValueConverter और IMultiValueConverter - इंटरफेस जो एक बाध्यकारी करने के लिए एक कस्टम तर्क को लागू करने का एक तरीका प्रदान करता है।

वे किसके लिए उपयोगी हैं

  1. आपके पास कुछ प्रकार का मूल्य है, लेकिन आप एक तरह से शून्य मान दिखाना चाहते हैं और दूसरे तरीके से सकारात्मक संख्या
  2. आपके पास कुछ प्रकार का मूल्य है और एक मामले में तत्व दिखाना चाहते हैं और दूसरे में छिपाना चाहते हैं
  3. आपके पास पैसे का एक संख्यात्मक मूल्य है लेकिन इसे शब्दों के रूप में दिखाना चाहते हैं
  4. आपके पास एक संख्यात्मक मान है लेकिन विभिन्न संख्याओं के लिए अलग-अलग चित्र दिखाना चाहते हैं

ये कुछ साधारण मामले हैं, लेकिन कई और भी हैं।

इस तरह के मामलों के लिए, आप एक मान कनवर्टर का उपयोग कर सकते हैं। ये छोटे वर्ग, जो 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;
        }
    }
}

कनवर्टर का उपयोग करना

  1. संसाधन को परिभाषित करें
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
  1. इसे बंधन में प्रयोग करें
<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;
    }
}

कनवर्टर का उपयोग करना

  1. नाम स्थान को परिभाषित करें

xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"

  1. संसाधन को परिभाषित करें
<converters:BooleanToVisibilityConverter x:Key="BoolToVisibilityInvertedConverter"
                                         Inverted="False"/>
  1. इसे बंधन में प्रयोग करें
<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();
    }
}

कनवर्टर का उपयोग करना

  1. नाम स्थान को परिभाषित करें
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
  1. संसाधन को परिभाषित करें
<converters:AddConverter x:Key="AddConverter"/>
  1. इसे बंधन में प्रयोग करें
<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();
    }
}

कनवर्टर का उपयोग करना

  1. नाम स्थान को परिभाषित करें
xmlns:converters="clr-namespace:MyProject.Converters;assembly=MyProject"
  1. संसाधन को परिभाषित करें
<converters:MultiplyConverter x:Key="MultiplyConverter"/>
  1. इसे बंधन में प्रयोग करें
<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;
    }
}
}

कनवर्टर का उपयोग करना:

  1. नाम स्थान को परिभाषित करें

    xmlns: कन्वर्टर्स = "clr-नाम स्थान: MyProject.Converters; विधानसभा = MyProject"

  2. बाध्यकारी में इस कनवर्टर का उदाहरण उपयोग

    <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()
        {
        }
    }
}

कनवर्टर का उपयोग करना:

  1. उदाहरण कार्यान्वयन - विधि जब कहा जाता 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]));
     }
    
  2. नाम स्थान को परिभाषित करें

xmlns: कन्वर्टर्स = "clr-नाम स्थान: MyProject.Converters; विधानसभा = MyProject"

  1. बाध्यकारी में इस कनवर्टर का उदाहरण उपयोग

    <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>
    


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow