কনভার্টারপ্যারামিটার হিসাবে কিভাবে একটি পূর্ণসংখ্যা পাস?


95

আমি একটি পূর্ণসংখ্যার সম্পত্তিকে আবদ্ধ করার চেষ্টা করছি:

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter=0}" />

এবং আমার রূপান্তরকারীটি হ'ল:

[ValueConversion(typeof(int), typeof(bool))]
public class IntToBoolConverter : IValueConverter
{
    public object Convert(object value, Type t, object parameter, CultureInfo culture)
    {
        return value.Equals(parameter);
    }

    public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
    {
        return value.Equals(false) ? DependencyProperty.UnsetValue : parameter;
    }
}

সমস্যাটি হ'ল যখন আমার রূপান্তরকারীকে প্যারামিটার বলা হয় স্ট্রিং। আমার এটি পূর্ণসংখ্যা হওয়া দরকার অবশ্যই আমি স্ট্রিংটি পার্স করতে পারি, তবে আমার কি আছে?

কোনও সহায়তা কনস্ট্যান্টিনের জন্য ধন্যবাদ


4
উইন্ডোজ ফোন প্ল্যাটফর্মে যেখানে বাইন্ডিংয়ের জন্য কিছুটা আলাদা সিনট্যাক্স রয়েছে সেখানে কীভাবে এটি অর্জন করা যায় তা কি কেউ জানেন? {বাইন্ডিং প্রোপার্টি, রূপান্তরকারী = {স্ট্যাটিক রিসোর্স মাইকনভার্টার}, রূপান্তরকারীপ্যারামিটার = INT_VAL example এই উদাহরণে INT_VAL একটি স্ট্রিং হিসাবে পাস হবে
Krzysztof Kaczor

উত্তর:


107

এই যে!

<RadioButton Content="None"
             xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <RadioButton.IsChecked>
        <Binding Path="MyProperty"
                 Converter="{StaticResource IntToBoolConverter}">
            <Binding.ConverterParameter>
                <sys:Int32>0</sys:Int32>
            </Binding.ConverterParameter>
        </Binding>
    </RadioButton.IsChecked>
</RadioButton>

কৌশলটি হ'ল মৌলিক সিস্টেমের প্রকারের জন্য নেমস্পেস অন্তর্ভুক্ত করা এবং তারপরে কমপক্ষে কনভার্টারপ্যারামিটার বাইন্ডিং উপাদান রূপে লিখতে।


4
এই সত্যটি যে ধরনের পরিবর্তন না IValueConverter.Convert()এর "PARAMETER" প্যারামিটার object। আপনার এখনও এটি কাস্ট / পার্স করতে হবে ...
ড্যান জে

6
@ ডিজোকবসন - সত্য তবে ভ্যালু কনভার্সন বৈশিষ্ট্যটি আপনাকে নির্দিষ্ট করতে দেয়। এটি আসলেই সংকলন-সময়ে বা রান-টাইমে আদৌ ব্যবহৃত হয়েছে কিনা তা নিশ্চিত নয়। মূল পোস্টারের প্রশ্নের ক্ষেত্রে তিনি উল্লেখ করেছেন যে "আমার এটি পূর্ণসংখ্যা হওয়া দরকার of অবশ্যই আমি স্ট্রিংটি পার্স করতে পারি, তবে আমার কি দরকার?" সুতরাং আমার উত্তরটি প্রমাণ করে যে এর মধ্যে কোনও স্ট্রিংয়ের পার্সিং নেই তবে কেবল একটি পূর্ণসংখ্যার আনবক্সিং রয়েছে যা আমি এখনও অনেক বেশি নিরাপদ।
জেপিয়ারসন

51

সম্পূর্ণতার জন্য, আরও একটি সম্ভাব্য সমাধান (সম্ভবত কম টাইপ করে):

<Window
    xmlns:sys="clr-namespace:System;assembly=mscorlib" ...>
    <Window.Resources>
        <sys:Int32 x:Key="IntZero">0</sys:Int32>
    </Window.Resources>

    <RadioButton Content="None"
                 IsChecked="{Binding MyProperty,
                                     Converter={StaticResource IntToBoolConverter},
                                     ConverterParameter={StaticResource IntZero}}" />

(অবশ্যই, Windowদিয়ে প্রতিস্থাপিত করা যাবে UserControl, এবং IntZeroপ্রকৃত ব্যবহারের জায়গা কাছাকাছি সংজ্ঞায়িত করা হতে পারে।)


45

WPFভাবেন না কেন লোকেরা ব্যবহারের দিকে ঝোঁক থাকে MarkupExtension। এটি এখানে উল্লিখিত সমস্যা সহ অনেক সমস্যার নিখুঁত সমাধান।

public sealed class Int32Extension : MarkupExtension
{
    public Int32Extension(int value) { this.Value = value; }
    public int Value { get; set; }
    public override Object ProvideValue(IServiceProvider sp) { return Value; }
};

যদি এই মার্কআপ এক্সটেনশানটি XAMLনামস্থান 'মি' তে উপলভ্য থাকে তবে মূল পোস্টারের উদাহরণটি হয়ে যায়:

<RadioButton Content="None"
             IsChecked="{Binding MyProperty,
                         Converter={StaticResource IntToBoolConverter},
                         ConverterParameter={m:Int32 0}}" />

এটি কাজ করে কারণ মার্কআপ এক্সটেনশন পার্সারটি কনস্ট্রাক্টর আর্গুমেন্টের শক্তিশালী প্রকারটি দেখতে এবং সেই অনুসারে রূপান্তর করতে পারে, তবে বাইন্ডিংয়ের কনভার্টারপ্যারামিটার আর্গুমেন্ট (কম-তথ্যমূলকভাবে) অবজেক্ট-টাইপযুক্ত।


ধন্যবাদ, এটি দরকারী ছিল। এটি আমার প্রথম এক্সএএমএল এক্সটেনশন হবে। কিন্তু আমার মনে হয় এটা করতে ভালো Valueএকটি objectবদলে intতাতে প্রতিটি সময় বক্সিং এড়াতে, ProvideValue। (এবং তারপরে, privateসরাসরি কোনও অবৈধ বিষয় এড়াতে এটিকে তৈরি করুন )।
জিউস

4
@ জিউস সাধারণত সাধারণত ProvideValueমার্কআপ এক্সটেনশন ইনস্ট্যান্সের জন্য একবার বলা হয়, তাই বক্সিং কেবল যাইহোক একবারই হওয়া উচিত। কনস্ট্রাক্টরে এটি না করে, আমি ProvideValueকখনই ডাকা না হলে আমি বক্সিং পুরোপুরি এড়িয়ে চলে । তৈরীর জন্য যেমন Valueব্যক্তিগত, এই মার্কআপ এক্সটেনশান ব্যবহার করে প্রতিরোধ করবে XAML: অবজেক্ট উপাদান সিনট্যাক্স msdn.microsoft.com/en-us/library/...
গ্লেন Slayden

আপনার শেষ অনুচ্ছেদটি ভুল। এটিকে টাইপ রূপান্তর বলা হয় এবং এটি বৈশিষ্ট্যের ক্ষেত্রেও প্রযোজ্য। জিনিসটি হ'ল Binding.ConverterParameterএর কোনও নির্দিষ্ট প্রকার নেই (এটি কেবলমাত্র একটি object) সুতরাং পার্সার জানেন না কোন রূপান্তরটি প্রয়োগ করতে হবে, তাই প্রতিটি আক্ষরিককে কেবল স্ট্রিং হিসাবে বিবেচনা করা হয়।
এইচবি

(সুতরাং আপনার যদি এক্সটেনশনের ডিফল্ট {m:Int32 Value=0}
এইচবি


0

এক্সএএমএল-তে কনভার্টারভ্যালুর জন্য প্রকারের তথ্যটি একরকম প্রকাশ করা ভাল লাগবে, তবে এখনই এটি সম্ভব বলে আমি মনে করি না। সুতরাং আমি অনুমান করি যে আপনাকে কিছু কাস্টম যুক্তি দ্বারা আপনার প্রত্যাশিত ধরণের রূপান্তরকারী অবজেক্টটি পার্স করতে হবে। আমি অন্য উপায় দেখতে পাচ্ছি না।

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