স্টাইল / টেমপ্লেট ব্যবহার করে ডাব্লুপিএফ-তে দশমিক স্থানগুলির সংখ্যার বিন্যাস কীভাবে করবেন?


94

আমি একটি ডাব্লুপিএফ প্রোগ্রাম লিখছি এবং আমি স্টাইল বা টেমপ্লেটের মতো কিছু পুনরাবৃত্তিযোগ্য পদ্ধতির মাধ্যমে একটি টেক্সটবক্সে ডেটা ফর্ম্যাট করার উপায়টি বের করার চেষ্টা করছি। আমার কাছে অনেকগুলি টেক্সটবক্স (সঠিক হতে 95) এবং প্রত্যেকটির নিজস্ব সংখ্যার ডেটাতে আবদ্ধ থাকে যা প্রত্যেকে তাদের নিজস্ব রেজোলিউশন সংজ্ঞায়িত করতে পারে। উদাহরণস্বরূপ, যদি ডাটাটি 2 রেজোলিউশন সহ 99.123 হয় তবে এটি 99.12 প্রদর্শন করা উচিত। একইভাবে 99 এবং রেজোলিউশন 3 এর একটি ডেটা মান 99.000 (99 নয়) হিসাবে প্রদর্শিত হবে। এই কাজ করতে একটি উপায় আছে কি?

সম্পাদনা: আমার স্পষ্ট করে বলা উচিত, বর্তমান স্ক্রিনে 95 টি পাঠ্যবক্স রয়েছে যার উপরে আমি কাজ করছি তবে আমি চাইছি যে প্রতিটি টেক্সটবক্স আমার প্রোগ্রামের বিভিন্ন স্ক্রিন জুড়ে দশমিক স্থানের সঠিক সংখ্যাটি প্রদর্শন করবে। এখন যেহেতু আমি এটি সম্পর্কে চিন্তা করি, এর মধ্যে কয়েকটি হ'ল পাঠ্যবক্স (যেমন এখন আমি যে স্ক্রিনে কাজ করছি) এবং কিছু হ'ল ডেটাগ্রিড বা তালিকাভিউস, তবে আমি যদি টেক্সটবক্সের জন্য এটি কীভাবে কাজ করতে পারি তা যদি আমি বুঝতে পারি তবে আমি নিশ্চিত যে আমি চিত্রিত করতে পারি এটি অন্যান্য নিয়ন্ত্রণগুলির জন্যও রয়েছে।

এই ক্ষেত্রে ভাগ করার মতো খুব বেশি কোড নেই তবে আমি এটি আরও পরিষ্কার করার চেষ্টা করব:

আমার কাছে একটি ভিউ মডেল রয়েছে যাতে নিম্নলিখিত বৈশিষ্ট্যগুলি রয়েছে (vb.net):

    Public ReadOnly Property Resolution As Integer
        Get
            Return _signal.DisplayResolution
        End Get
    End Property

    Public ReadOnly Property Value As Single
        Get
            Return Math.Round(_signal.DisplayValue, Resolution)
        End Get
    End Property

এবং এক্সএএমএল-এ আমার রয়েছে:

<UserControl.Resources>
    <vm:SignalViewModel x:Key="Signal" SignalPath="SomeSignal"/>
</UserControl.Resources>
<TextBox Grid.Column="3" IsEnabled="False" Text="{Binding Path=Value, Source={StaticResource Signal}, Mode=OneWay}" />

সম্পাদনা 2 (আমার সমাধান): দেখা যাচ্ছে যে কম্পিউটার থেকে কিছুক্ষণ দূরে সরে যাওয়ার পরে আমি একটি সাধারণ উত্তর পেয়েছিলাম যা আমাকে মুখে ঘাবিয়েছে। ভিউ মডেলে ডেটা ফর্ম্যাট করুন!

    Public ReadOnly Property Value As String
        Get
            Return (Strings.FormatNumber(Math.Round(_signal.DisplayValue, _signal.DisplayResolution), _signal.DisplayResolution))
        End Get
    End Property

4
একটি ব্যবহার IValueConverter? রূপান্তরকারীকে আসল মান এবং রেজোলিউশনটি পাস করুন এবং এটি নিজের মধ্যে আপনার জন্য বৃত্তাকার তৈরি করুন। StringFormatএই 95 টি ঠিক কীভাবে TextBoxউত্পন্ন হয় তা না জেনে পরামর্শ দেওয়া শক্ত ।
ভিভ

বর্তমান কোড এবং এক্সএএমএল পোস্ট করুন। অন্যথায় এটি সমস্ত জল্পনা এবং অপ্রয়োজনীয় অনুমান।
ফেডেরিকো বেরাসেত্তুই

আমি প্রশ্নের আরও কিছু তথ্য যুক্ত করেছি যা আশা করি এটি আরও পরিষ্কার করা উচিত।
AXG1010

উত্তর:


197

আপনি ব্যবহার করা উচিত StringFormatউপর Binding। আপনি স্ট্যান্ডার্ড স্ট্রিং ফর্ম্যাট বা কাস্টম স্ট্রিং ফর্ম্যাটগুলি ব্যবহার করতে পারেন :

<TextBox Text="{Binding Value, StringFormat=N2}" />
<TextBox Text="{Binding Value, StringFormat={}{0:#,#.00}}" />

লক্ষ্য করুন যে StringFormatযখন লক্ষ্য সম্পত্তি টাইপ স্ট্রিং হয় কেবল তখনই কাজ করে। আপনি যদি কোনও Contentসম্পত্তি ( typeof(object)) এর মতো কিছু সেট করার চেষ্টা করছেন তবে আপনাকে একটি কাস্টম ব্যবহার করতে হবে StringFormatConverter( এখানে এখানে ), এবং আপনার বিন্যাসের স্ট্রিংটি হিসাবে হিসাবে পাস করতে হবে ConverterParameter

আপডেট হওয়া প্রশ্নের জন্য সম্পাদনা করুন

সুতরাং, যদি আপনি ViewModelনির্ভুলতা সংজ্ঞায়িত করেন তবে আমি এটি হিসাবে এটি করার MultiBindingএবং আপনার নিজের তৈরি করার প্রস্তাব দিই IMultiValueConverter। এটি ব্যবহারের ক্ষেত্রে বেশ বিরক্তিকর, সাধারণ বাঁধন থেকে শুরু করে একটিতে প্রসারিত হওয়া দরকার MultiBinding, তবে সংকলনের সময় যদি নির্ভুলতাটি জানা না যায় তবে আপনি যা করতে পারেন তা এটি বেশ সুন্দর। আপনার IMultiValueConverterমান, যথার্থতা এবং ফর্ম্যাট স্ট্রিং আউটপুট নিতে হবে। আপনি এটি ব্যবহার করে সক্ষম হবেন String.Format

তবে, এর মতো জিনিসের জন্য ContentControlআপনি আরও সহজেই এটি দিয়ে করতে পারেন Style:

<Style TargetType="{x:Type ContentControl}">
    <Setter Property="ContentStringFormat" 
            Value="{Binding Resolution, StringFormat=N{0}}" />
</Style>

যে কোনও নিয়ন্ত্রণ যা প্রকাশ করে ContentStringFormatতা এইরকম ব্যবহার করা যেতে পারে। দুর্ভাগ্যক্রমে, এর TextBoxমতো কিছুই নেই।


6
স্ট্রিংফর্ম্যাট সেট উদাহরণটি সংকলন #,#.00করে না - কমাটি Bindingমার্কআপ এক্সটেনশনে বৈশিষ্ট্যের জন্য একটি সীমানা হিসাবে ব্যাখ্যা করা হয় ।
গিগি

@Gigi, তুমি ঠিক আছে, কিন্তু আপনি সহজেই এটা এত পছন্দ ব্যবহার করতে পারেন: StringFormat={}{0:#,#.00}। আমি সঠিকভাবে উত্তর উত্তর আপডেট করব।
আবে হাইড্রেব্রাক্ট

'স্ট্রিংফর্ম্যাট = এন {0}' দুর্দান্ত কাজ করে। 2 এর যথার্থতার জন্য আমি '10 .00 'ব্যতীত দুটি দশমিক প্রদর্শন করতে চাই, সেই ক্ষেত্রে আমি' 10 'প্রদর্শিত হতে চাই। নির্ভুলতার সাথে আবদ্ধ হওয়ার জন্য এটি করার কোনও উপায় আছে কি? দেখে মনে হচ্ছে আমাকে একটি কনভার্টার ব্যবহার করতে হবে।
গর্ডন স্লাইজ

NET স্ট্রিং ফর্ম্যাটগুলি ব্যবহার করে উপস্থাপিত দশমিক পরিবর্তন করার কোনও উপায় আছে বলে আমি মনে করি না, তাই আপনি সম্ভবত রূপান্তর লেখার চেয়ে আরও ভাল।
আবে হাইড্রেব্রাক্ট

আপনি কী ব্যাখ্যা করতে পারেন যে দুটি স্পেসিফায়ার 0: #, #। 00 ব্যবহার করুন, তাদের মধ্যে কেবল একটিই যথেষ্ট হবে না?
লেই ইয়াং

7

গৃহীত উত্তর ০.০৯৯৯ এর মতো ইনপুট দেওয়ার ক্ষেত্রে পূর্ণসংখ্যার স্থানে 0 দেখাচ্ছে না এটি ডাব্লুপিএফ ইউআইতে .3 দেখায়। সুতরাং আমার পরামর্শটি নিম্নলিখিত স্ট্রিং ফর্ম্যাটটি ব্যবহার করার জন্য

<TextBox Text="{Binding Value,  StringFormat={}{0:#,0.0}}" 

হাই, আপনার সমাধানটি ঠিক আছে তবে আমি মূল শব্দ এন 1 (2,3 ...) ব্যবহার করতে চাই কারণ এটি টাইপ ভুলগুলি এড়িয়ে চলে এবং কমপক্ষে আপনি কীভাবে এটি প্রদর্শিত হবে তা নিশ্চিত। তবে প্রকৃতপক্ষে দ্বিতীয় পরামর্শটি যদি আপনার উল্লেখ করা মান <0 পছন্দ করে না তবে 0টি দেখায় না।
কেভিন ভিডিএফ

-2
    void NumericTextBoxInput(object sender, TextCompositionEventArgs e)
    {
        TextBox txt = (TextBox)sender;
        var regex = new Regex(@"^[0-9]*(?:\.[0-9]{0,1})?$");
        string str = txt.Text + e.Text.ToString();
        int cntPrc = 0;
        if (str.Contains('.'))
        {
            string[] tokens = str.Split('.');
            if (tokens.Count() > 0)
            {
                string result = tokens[1];
                char[] prc = result.ToCharArray();
                cntPrc = prc.Count();
            }
        }
        if (regex.IsMatch(e.Text) && !(e.Text == "." && ((TextBox)sender).Text.Contains(e.Text)) && (cntPrc < 3))
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
    }

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