রিফ্রেশ করার জন্য একটি ডাব্লুপিএফ বাধ্যতামূলক কীভাবে?


112

আমি সাধারণ বাঁধন ব্যবহার করে আইটেম উত্স সংযুক্ত একটি কম্বো বাক্স পেয়েছি। কম্বো বাক্সটি লোড হয়ে গেলে এই বাঁধাইটি রিফ্রেশ করার কোনও উপায় আছে কি?


1
সাধারণ বাঁধাই বলতে কী বোঝ? সাধারণত আপনি যখন বাইন্ডিং ব্যবহার করেন তখন নিয়ন্ত্রণটি স্বয়ংক্রিয়ভাবে সতেজ হওয়া উচিত।
এরনো

12
তেচি, কোনও অপরাধ নয়, তবে আমি বিশ্বাস করি এইচবি তার উত্তর মেনে নেওয়ার দাবিদার ;-)
দানি

1
@ দানি আমি নিশ্চিত নই যে টেচি কখনও ফিরে আসবে - তার লগইন হওয়ার সাড়ে ছয় বছর পরে
দ্য লোনলি কোডার

উত্তর:


198

আপনি বাঁধাই অভিব্যক্তি ব্যবহার করতে পারেন:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ((ComboBox)sender).GetBindingExpression(ComboBox.ItemsSourceProperty)
                      .UpdateTarget();
}

তবে ব্লাইন্ডমাইস হিসাবে উল্লিখিত হয়েছে যে আপনি পরিবর্তন সংক্রান্ত বিজ্ঞপ্তিগুলিও ফায়ার করতে পারেন, যদি আপনার সংগ্রহটি প্রয়োগ করে INotifyCollectionChanged(উদাহরণস্বরূপ এর প্রয়োগ করা হয় ObservableCollection<T>) এটি সিঙ্ক্রোনাইজ হবে যাতে আপনার এগুলির কোনও করার দরকার নেই।


লিস্টবক্স ব্যবহার করে আমার জন্য কিছু করার মনে হচ্ছে না।
জোনাথন উড

@ জোনাথনউইড: আচ্ছা, আপনার বাঁধাইয়ের মতো দেখতে আপনাকে কী ধরণের কোড আছে তা আমি প্রকাশ করতে পারি না। বাঁধাই এমনকি প্রথম স্থানে কাজ করে?
এইচবি

56

আপনি যদি এমভিভিএম ব্যবহার করেন এবং আপনার আইটেমসোর্সটি আপনার ভিএম এ অবস্থিত। যখন আপনি রিফ্রেশ করতে চান তখন কেবল আপনার সংগ্রহের সম্পত্তিটির জন্য INotifyPropertyChanged কল করুন।

OnPropertyChanged("YourCollectionProperty");

7
এই পরিষ্কার পরিচ্ছন্নতা imho।
অ্যাশ

এটি যেখানে সম্ভব সেখানে করা উচিত, তবে এটি লক্ষ করা উচিত যে এটি সর্বদা ব্যবহারিক নয়। উদাহরণস্বরূপ, আপনি যদি সিরিয়াল বন্দরে আবদ্ধ হন, এবং এটি খোলার, বন্ধ, বাউড রেট ইত্যাদি পরীক্ষা করতে চান INotifyPropertyChangedতবে আপনি সিরিয়াল বন্দরটির চারপাশে একটি র‌্যাপার ক্লাস তৈরি করতে পারেন যা প্রয়োগ করে , তবে আপনাকে পোর্টটি ব্যক্তিগত রাখতে হবে এই মোড়কটি এবং সেইজন্য যে বন্দরে আপনি অন্য যে কোনও জায়গায় যে প্রকল্পটি ব্যবহার করতে চান সে বিষয়ে নিশ্চিত হওয়ার জন্য যে সম্পত্তিটি আপনি আগ্রহী সেগুলি সর্বদা মোড়কের মধ্য দিয়ে যান
এ্যাসিলেটার

7
এছাড়াও, আমি nameof(YourCollectionProperty)আক্ষরিক স্ট্রিংয়ের বিপরীতে ব্যবহার করার একটি বড় অনুরাগী । এটি বাগগুলি রিফ্যাক্টরিং থেকে বাধা দেয় এবং প্রকৃত উদ্দেশ্য কী তা আরও স্পষ্ট। এই কোর্স যেখানে আপনি ব্যবহার করতে পারবেন না হয় CallerMemberNameযা এমনকি nicer হয় অ্যাট্রিবিউট
Assimilater

31

আমার 2 সেন্ট যোগ করতে, আপনি যদি নিজের নিয়ন্ত্রণের নতুন মান সহ আপনার ডেটা উত্সটি আপডেট করতে চান তবে আপনার UpdateSource()পরিবর্তে কল করতে হবে UpdateTarget():

((TextBox)sender).GetBindingExpression(ComboBox.TextProperty).UpdateSource();

1
আমি এই উত্তরটি আরও ভাল পছন্দ করি।
চপনাট

8

মাল্টিবাইন্ডিং বন্ধুত্বপূর্ণ সংস্করণ ...

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    BindingOperations.GetBindingExpressionBase((ComboBox)sender, ComboBox.ItemsSourceProperty).UpdateTarget();
}


0

আমি ব্যাকএন্ড থেকে ডেটা আনছিলাম এবং কোডের এক লাইনের সাথে স্ক্রিন আপডেট করেছি। এটা কাজ করেছে. নিশ্চিত না, কেন আমাদের ইন্টারফেস প্রয়োগ করা দরকার। (উইন্ডোজ 10, ইউডাব্লুপি)

    private void populateInCurrentScreen()
    {
        (this.FindName("Dets") as Grid).Visibility = Visibility.Visible;
        this.Bindings.Update();
    }

এটি.বাইন্ডিংস.আপডেট () স্ক্রিনের সমস্ত বাঁধাই রিফ্রেশ করে। এফওয়াইআই
Itzdsp

আমি এটি চেষ্টা করেছিলাম U
জেমস এশ

হ্যাঁ. এবং এটি.বন্ধগুলি এখনও বিদ্যমান নেই not
জেমস এশ

2
Bindings.Update () কেবলমাত্র উপলব্ধ যেখানে সংকলিত বাইন্ডিংগুলি (x: বিন্দু) ব্যবহৃত হয় ... এবং সংকলিত বাইন্ডিংগুলি কেবলমাত্র
UWP- এ

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