ডাব্লুপিএফ বাইন্ডিংয়ে মান বাতিল করতে হবে


116

দয়া করে নীচের লাইনে একবার দেখুন

<TextBox Text="{Binding Price}"/>

উপরের এই মূল্যের সম্পত্তিটি হ'ল Decimal?(নূন্যতম দশমিক)।

আমি চাই যে ব্যবহারকারী যদি পাঠ্যবক্সের বিষয়বস্তু মুছে ফেলেন (যেমন শূন্য স্ট্রিংয়ের প্রবেশ করে, এটি স্বয়ংক্রিয়ভাবে নাল (ভিবিতে কিছুই নয়) দিয়ে উত্স আপডেট করতে হবে।

আমি কীভাবে এটি 'জ্যামলি' করতে পারি তার কোনও ধারণা?

উত্তর:


226

আমি .NET 3.5 এসপি 1 ব্যবহার করছি তাই এটি খুব সহজ:

<TextBox Text="{Binding Price, TargetNullValue=''}"/>

যার জন্য দাঁড়িয়েছে (আপনার মন্তব্যের জন্য গ্রেগরকে ধন্যবাদ):

<TextBox Text="{Binding Price, TargetNullValue={x:Static sys:String.Empty}}"/>

sysজন্য আমদানিকৃত xml নেমস্পেস হয় Systemমধ্যে mscorlib:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

আশা করি যে সাহায্য করেছে।


13
আসলে টার্গেটনালভ্যালু ঠিক কাজ করে। এটি যা দেয় তা হ'ল প্রদত্ত মান এবং শূন্যতার মধ্যে সমতা সেট করে। সুতরাং এই ক্ষেত্রে যখন সীমাবদ্ধ মানটি নাল হয় এটি একটি খালি স্ট্রিং প্রদর্শিত হবে এবং যখন লক্ষ্যটির মান খালি স্ট্রিং হয় এটি সীমাবদ্ধ মানটি নালায় সেট করবে।
ব্রায়ান অ্যান্ডারসন

4
টার্গেটনুলভ্যালু কাজ করে। মান রূপান্তরকারী ব্যবহার করার সময় আমি একই ফলাফল পেয়েছি। <পাঠ্যবাক্স টেক্সট = "{বাঁধাই মূল্য, TargetNullValue = ''}" />: আপনি অভিব্যক্তি প্রক্রিয়া সহজ করতে
গ্রেগর Slavec

2
আমি বিভ্রান্ত করছি - ওপি বলছে: "..it automatcally নাল সঙ্গে উৎস আপডেট করা উচিত [যখন উদ্দিষ্ট একটি খালি স্ট্রিং]।", কিন্তু TargetNullValue আপডেট উদ্দিষ্ট নয় উত্স !
মার্কমান্ন

1
আপনি একমাত্র বিভ্রান্ত নন - অন্য উত্তরেও বিভ্রান্ত মন্তব্য রয়েছে। ওপিটিও কিছুটা বিভ্রান্ত হয়ে পড়ে, যখন সে উত্সটি আপডেট করার কথা বলে, তখন তার আসল অর্থ ডাব্লুপিএফ স্পোকের লক্ষ্য (উত্সটি টেক্সটবক্সের পাঠ্য সম্পত্তি) property টার্গেটনালভ্যালু বলে যে লক্ষ্যটি শূন্য থাকে তখন উত্সটি কী সেট করতে হয়। এর বিপরীতটি, যা আমরা এখানে সুবিধা নিচ্ছি তা হ'ল উত্সটি যখন এই নির্দিষ্ট মানটিতে আপডেট করা হয়, তখন লক্ষ্যটি বাতিল হয়ে যায়।
নাথান ফিলিপস

@markmnl যদিও টার্গেটনুলভালু আসলেই আপডেট করার পরিকল্পনা করেছে Targetএবং না Source, এই সমাধানটি এখনও কিছু কারণে চালিত করে (কেন আমি বুঝতে পারি না)।
টিম পোহলমান

12

এই মান রূপান্তরকারীটি কৌশলটি করা উচিত:

public class StringToNullableDecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
        CultureInfo culture)
    {
        decimal? d = (decimal?)value;
        if (d.HasValue)
            return d.Value.ToString(culture);
        else
            return String.Empty;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        string s = (string)value;
        if (String.IsNullOrEmpty(s))
            return null;
        else
            return (decimal?)decimal.Parse(s, culture);
    }
}

রিসোর্সগুলিতে এই রূপান্তরকারীটির একটি উদাহরণ ঘোষণা করুন:

<Window.Resources>
    <local:StringToNullableDecimalConverter x:Key="nullDecimalConv"/>
</Window.Resources>

এবং এটি আপনার বাধ্যবাধকতায় ব্যবহার করুন:

<TextBox Text="{Binding Price, Converter={StaticResource nullDecimalConv}}"/>

নোট যে TargetNullValueএখানে উপযুক্ত নয়: এটি যখন sourceবাইন্ডিংয়ের শূন্য হয় তখন কোন মানটি ব্যবহার করা উচিত তা নির্ধারণ করতে ব্যবহৃত হয়। এখানে Priceউত্স নয়, এটি উত্সের সম্পত্তি ...


2
একটি রূপান্তরকারী এটি করার সঠিক উপায় এবং আপনি এক্সএএমএলে এই রূপান্তরকারীদের সংজ্ঞা দিতে পারবেন না। রূপান্তরকারীরা আপনাকে ডেটা-বন্ডিংয়ে রূপান্তর আচরণের ডিফল্ট "অবজেক্ট টু অবজেক্ট" পরিবর্তন করতে দেয়, যা আপনি করতে চাইছেন।
উইল এডিনস

আমার ক্ষেত্রে সমস্যাটি হ'ল আমি এখানে ইতিমধ্যে একটি কনভেরিটার ব্যবহার করেছি যা অন্য কাজ করে। আমি একটি উত্তর পোস্ট করেছি, দয়া করে একবার দেখুন।
শিমি ওয়েটজ্যান্ডলার

"" নাল হিসাবে গণনা করার অনুমতি দেওয়ার জন্য "" IsNullOrWhiteSpace () ব্যবহার করতে চাইলে (সম্ভবত আপনি যা চান)
সাইমন_উইভার

+1 টি যাইহোক: মূল্য এখানে আপনার উৎস কিন্তু আপনি সঠিক TargetNullValue এখানে উপযুক্ত নয় রয়েছে - TargetNullValue সেট করে লক্ষ্য যখন উৎস নাল - আমরা সেট করতে চান যেহেতু উৎস (একটি খালি (বাতিলে) যখন লক্ষ্য একটি নির্দিষ্ট মান স্ট্রিং) - যা আপনার রূপান্তরকারী করে।
মার্কমনল

5

আপনি একটি ValueConverter (IValueConverter) ব্যবহার করে চেষ্টা করতে পারেন http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

এখানে আমার মাথার পিছনের দিকের কিছু:

public class DoubleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        return (double)value;
    }

    public object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
    var doubleValue = Convert.ToDouble(value);

    return (doubleValue == 0 ? null : doubleValue);
    }
}

(যদিও কিছু টুইট করার প্রয়োজন হতে পারে)


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