এক্সএএমএল-তে একাধিক মান রূপান্তরকারীদের কোনও উপায় আছে?


123

আমি একটি পরিস্থিতি পেয়েছি যার মধ্যে দুটি পৃথক রূপান্তর করার পরে আমার ডেটা প্রসঙ্গে একটি সম্পত্তির সাথে আবদ্ধ একটি পূর্ণসংখ্যা মান দেখাতে হবে:

  1. একটি ব্যাপ্তির মধ্যে মানটি বিপরীত করুন (উদাহরণস্বরূপ পরিসীমা 1 থেকে 100; ডেটাকন্টেক্সটে মান 90 হয়; ব্যবহারকারী 10 এর মান দেখায়)
  2. সংখ্যাটি স্ট্রিংয়ে রূপান্তর করুন

আমি বুঝতে পারি যে আমি নিজের কনভার্টর তৈরি করে উভয় পদক্ষেপগুলি করতে পারি (যা IValueConverter প্রয়োগ করে)। যাইহোক, আমি ইতিমধ্যে একটি পৃথক মান রূপান্তরকারী পেয়েছি যা ঠিক প্রথম ধাপটি করে এবং দ্বিতীয় ধাপটি ইন্টার 32Converter দ্বারা আচ্ছাদিত।

এক্সএএমএল-তে এই দুটি বিদ্যমান ক্লাসকে কীভাবে যুক্ত করার মতো কোনও আরও ক্লাস তৈরি না করেই কি উপায় আছে ?

আমার যদি এগুলির কোনও স্পষ্ট করতে হয় তবে দয়া করে আমাকে জানান। :)

ধন্যবাদ।

উত্তর:


198

আমি আমার সিলভারলাইট প্রকল্পে গ্যারেথ ইভান্স দ্বারা এই পদ্ধতিটি ব্যবহার করেছি।

এটি এখানে আমার বাস্তবায়ন:

public class ValueConverterGroup : List<IValueConverter>, IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
    }

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

    #endregion
}

যা এক্সএএমএলে এর পরে ব্যবহার করা যেতে পারে:

<c:ValueConverterGroup x:Key="InvertAndVisibilitate">
   <c:BooleanInverterConverter/>
   <c:BooleanToVisibilityConverter/>
</c:ValueConverterGroup>

3
কনভার্টব্যাকের একটি বাস্তবায়নের জন্য সংগ্রহের একটি অনুলিপি তৈরি করা এবং এটিকে বিপরীত করা, এবং তারপরে সামগ্রিকভাবে সংগ্রহ করা? সুতরাং কনভার্টব্যাকটি হবেreturn this.Reverse<IValueConverter>().Aggregate(value, (current, converter) => converter.ConvertBack(current, targetType, parameter, culture));
নিক উডেল

5
@DLeh এটি কার্যকরভাবে হিসাবে মার্জিত হয় না কাজ করে না। এটি সঠিক টার্গেটের পরিবর্তে চূড়ান্ত লক্ষ্য প্রকারের সাথে সমস্ত রূপান্তরকারী সরবরাহ করে ...
আলেকসান্দার টোপলক

আমি কীভাবে এটি প্রথম রূপান্তরকারী হিসাবে একটি মাল্টিভ্যালু কনভার্টারের সাথে ব্যবহার করতে পারি?
লাইটমোনক

1
@ ডাউন এক সহকর্মী সবেমাত্র এই প্রশ্নটি খুঁজে পেয়েছেন এবং এটি আমাদের নস্টালজিয়ার জন্য আবার এটি সন্ধান করতে বাধ্য করেছে। কেবলমাত্র, আমি কেবল লক্ষ্য করেছি যে আপনি প্রাপ্য ক্রেডিট পাচ্ছেন না (আমি নিজের উত্তরটি স্বীকার করেছি !), তাই আমি এখন আপনার উত্তরটিকে স্বীকৃত হিসাবে চিহ্নিত করেছি। মাত্র 9 বছর দেরী ...: ফেসপাম:
মল রস

নিবন্ধন করুন ধন্যবাদ! এটি এখনও কার্যকর বলে শুনে ভাল, আমি সেই প্রায় 8 বছরের জন্য সিলভারলাইটটি এখনও স্পর্শ করতে পারি নি এবং এখনও এটি আমার সবচেয়ে জনপ্রিয় উত্তর :)
টাউন

54

আমি যা সন্ধান করছিলাম ঠিক তা পেয়েছি, জোশ স্মিথের সৌজন্যে: পাইপিং মান রূপান্তরকারী (আর্কাইভ.অর্গ লিঙ্ক)

তিনি একটি ValueConverterGroupক্লাস সংজ্ঞায়িত করেছেন , যার এক্সএএমএল-তে আমি যেমন আশা করছিলাম ঠিক তেমন ব্যবহার। এখানে একটি উদাহরণ:

<!-- Converts the Status attribute text to a SolidColorBrush used to draw 
     the output of statusDisplayNameGroup. -->
<local:ValueConverterGroup x:Key="statusForegroundGroup">
  <local:IntegerStringToProcessingStateConverter  />
  <local:ProcessingStateToColorConverter />
  <local:ColorToSolidColorBrushConverter />
</local:ValueConverterGroup> 

দুর্দান্ত জিনিস। ধন্যবাদ, জোশ :)


2
এই সমাধানে, প্রতিটি রূপান্তরকারীকে কেবল এক প্রকারের সাথে ডিল করতে হবে (এটি অবশ্যই একক-মান মান রূপান্তর-বৈশিষ্ট্যে ঘোষণা করা উচিত)। @ ডাউন সলিউশন মাল্টিকনভার্টারগুলিও মোকাবেলা করতে পারে।
ওয়াই শোহম

9
দয়া করে বাস্তবায়ন পোস্ট করুন; অন্যথায়, লিঙ্করোট
জেক বার্গার

9

টাউন বাস্তবায়ন এর গ্যারেথ ইভান্স এর সিলভারলাইট প্রকল্পের , মহান তবে এটা ভিন্ন রূপান্তরকারী পরামিতি সমর্থন করে না।

আমি এটিকে সংশোধন করেছি যাতে আপনি প্যারামিটারগুলি সরবরাহ করতে পারেন, কমা সীমান্তে (যদি না আপনি অবশ্যই এড়িয়ে যান)।

কনভার্টার:

public class ValueConverterGroup : List<IValueConverter>, IValueConverter
{
    private string[] _parameters;

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if(parameter != null)
            _parameters = Regex.Split(parameter.ToString(), @"(?<!\\),");

        return (this).Aggregate(value, (current, converter) => converter.Convert(current, targetType, GetParameter(converter), culture));
    }

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

    private string GetParameter(IValueConverter converter)
    {
        if (_parameters == null)
            return null;

        var index = IndexOf(converter as IValueConverter);
        string parameter;

        try
        {
            parameter = _parameters[index];
        }

        catch (IndexOutOfRangeException ex)
        {
            parameter = null;
        }

        if (parameter != null)
            parameter = Regex.Unescape(parameter);

        return parameter;
    }
}

নোট: ConvertBack এখানে বাস্তবায়িত হয়নি, আমার দেখতে সারকথা পূর্ণ সংস্করণ জন্য।

বাস্তবায়ন:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:converters="clr-namespace:ATXF.Converters;assembly=ATXF" x:Class="ATXF.TestPage">
  <ResourceDictionary>
    <converters:ValueConverterGroup x:Key="converters">
      <converters:ConverterOne />
      <converters:ConverterTwo />
    </converters:ValueConverterGroup>
  </ResourceDictionary>

  <Label Text="{Binding InitialValue, Converter={StaticResource converters}, ConverterParameter='Parameter1,Parameter2'}" />
</ContentPage>

6

হ্যাঁ, চেইন রূপান্তরকারীগুলির উপায় রয়েছে তবে এটি দেখতে সুন্দর দেখাচ্ছে না এবং আপনার এটির দরকার নেই। আপনি যদি কখনও এটির প্রয়োজনে আসেন, নিজেকে জিজ্ঞাসা করুন এটি কি সত্যিই যাওয়ার উপায়? আপনার নিজের কনভার্টারটি লিখতে হলেও সহজ সর্বদা আরও ভাল কাজ করে।

আপনার বিশেষ ক্ষেত্রে, আপনাকে যা করতে হবে তা হ'ল স্ট্রিংয়ে রূপান্তরিত মান ফর্ম্যাট করা। StringFormatসম্পত্তি এক Bindingএখানে আপনার বন্ধু।

 <TextBlock Text="{Binding Value,Converter={StaticResource myConverter},StringFormat=D}" />

5
আপনি যদি বাইন্ডিংগুলি ভারীভাবে ব্যবহার করেন তবে চ্যানেল রূপান্তরকারীগুলিতে কাস্টম রূপান্তরকারী লেখার সাথে সাথে সমস্ত ধরণের কনফিগারেশনের জন্য টন বোনা কনভার্টারের সমাপ্তি ঘটে। সেক্ষেত্রে গৃহীত উত্তরটি একটি দুর্দান্ত সমাধান।
জেসেক গর্গোń

0

মাল্টি-বাইন্ডিং সমর্থন করার জন্য টাউনটির উত্তরটির একটি ছোট विस्तार এখানে দেওয়া হয়েছে :

public class ValueConverterGroup : List<IValueConverter>, IValueConverter, IMultiValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return this.Aggregate(value, (current, converter) => converter.Convert(current, targetType, parameter, culture));
    }

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

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return Convert(values as object, targetType, parameter, culture);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.