এমভিভিএম-এ ভিউমোডেল বা মডেলকে INotifyPropertyChanged প্রয়োগ করতে হবে?


165

বেশিরভাগ এমভিভিএম উদাহরণের মাধ্যমে আমি কাজ করেছি মডেলটি বাস্তবায়িত হয়েছিল INotifyPropertyChanged, তবে জোশ স্মিথের কমান্ডসিংকের উদাহরণে ভিউমোডেল প্রয়োগগুলি রয়েছেINotifyPropertyChanged

আমি এখনও জ্ঞানীয়ভাবে এমভিভিএম ধারণাগুলি একসাথে রাখছি, তাই আমি জানি না:

  • আপনি দিতে হবে INotifyPropertyChangedViewModel পেতে CommandSinkকাজ
  • এটি কেবল আদর্শের একটি বিচ্যুতি এবং এটি আসলে কোনও বিষয় নয়
  • আপনার সর্বদা মডেলটি প্রয়োগ করা উচিত INotifyPropertyChangedএবং এটি কেবল একটি ভুল যা সংশোধন করা হত যদি এটি কোড উদাহরণ থেকে কোনও অ্যাপ্লিকেশনটিতে তৈরি করা হয়

আপনি যে এমভিভিএম প্রকল্পগুলিতে কাজ করেছেন তার অভিজ্ঞতা অন্যদের কী ছিল?


4
আপনি যদি আইএনপিসি বাস্তবায়ন করেন, github.com/Fody/PropertyChanged চেষ্টা করে দেখুন - এটি আপনার কয়েক সপ্তাহের টাইপ সাশ্রয় করবে।
সিএডি

উত্তর:


104

আমি একেবারে বিপরীত বলব, আমি সবসময় INotifyPropertyChangedআমার ভিউমোডেলটিতে রাখি - আপনি সত্যিই মোটামুটি ডাব্লুপিএফ নির্দিষ্ট বৈশিষ্ট্য সহ আপনার মডেলটিকে দূষিত করতে চান না INotifyPropertyChanged, সেই জিনিসটি ভিউমোডেলে বসে থাকতে হবে।

আমি নিশ্চিত অন্যরাও এতে দ্বিমত পোষণ করবে না, তবে আমার কাজ করার উপায়।


84
মডেলটিতে কোনও সম্পত্তি পরিবর্তন হলে আপনি কী করবেন? আপনার এটি কোনওভাবে ভিউ-মডেলটিতে পৌঁছানো দরকার। সৎ প্রশ্ন, আমি এখনই এই ধাঁধাটি নিয়ে কাজ করছি।
রজার লিপসক্বে

4
প্রিজম কোডের ইভেন্টএগ্রিগেটর একটি কাস্টম সম্পত্তি পরিবর্তিত ইভেন্টের ধরণ সহ মডেলটিতে INotifyPropertyChanged- এর একটি ভাল বিকল্প। এই প্রকল্পের ইভেন্ট কোডটি ব্যাকগ্রাউন্ড এবং ইউআই থ্রেডগুলির মধ্যে ফরোয়ার্ড করা ইভেন্টগুলিকে সমর্থন করে যা কখনও কখনও সমস্যা হতে পারে।
স্টিভ মিচাম

51
INotifyProperyChanged ডাব্লুপিএফ নির্দিষ্ট নয়, এটি সিস্টেমে বাস করে omp কম্পোনেন্টমোডেল নেমস্পেস, আমি এটি উইনফোর্স অ্যাপ্লিকেশনগুলিতে ব্যবহার করেছি, আইএনটিফাইপ্রোট্টি চ্যাঞ্জড .০.০ থেকে রয়েছে, ডাব্লুপিএফ কেবল ৩.০ থেকে হয়েছে
বেনপিয়্যার

40
আমি মডেল এবং ভিউমোডেল উভয়ই INotifyPropertyChanged রাখার ভক্ত। আমি এটি না করার কোনও কারণ ভাবতে পারি না। ভিউমোডেলকে অবহিত করার এটি একটি দুর্দান্ত উপায়, যখন আপনার মোডে পটভূমি পরিবর্তনগুলি ঘটেছে যা ভিউমোডেলকে প্রভাবিত করে ঠিক যেমন ভিউউকে জানাতে ব্যবহৃত হয়েছিল এবং এখানে ভিউমোডেলে পরিবর্তন হয়েছে।
স্কটচের

6
@ স্টিভ - ভিউমোডেলকে অবহিত করার বিষয়ে যে কোনও মডেলের সম্পত্তি পরিবর্তিত হয়েছে, মনে হচ্ছে INotifyPropertyChanged "ভিউমোডেলটি যে কোনও ইভেন্টে প্রবেশ করতে পারে" হিসাবে ঠিক ঠিক কাজ করে। কেন ব্যবহার করবেন না?
স্কাইব্লাইকোডেফায়ার

146

মডেলটি বাস্তবায়ন করা উচিত নয় এই ধারণার সাথে আমি দৃ strongly়তার সাথে একমত নই INotifyPropertyChanged। এই ইন্টারফেসটি ইউআই নির্দিষ্ট নয়! এটি কেবল একটি পরিবর্তনকে অবহিত করে। প্রকৃতপক্ষে, ডাব্লুপিএফ ভারী পরিবর্তনগুলি সনাক্ত করতে এটি ব্যবহার করে তবে এর অর্থ এই নয় যে এটি একটি ইউআই ইন্টারফেস। আমি এটি নিম্নলিখিত মন্তব্যের সাথে তুলনা করব: " একটি টায়ার একটি গাড়ী আনুষাঙ্গিক "। অবশ্যই এটি, তবে বাইক, বাস ইত্যাদি। সংক্ষেপে, সেই ইন্টারফেসটিকে কোনও UI জিনিস হিসাবে গ্রহণ করবেন না।

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

যাইহোক, জিনিসগুলি অর্জনের বিভিন্ন উপায় রয়েছে তবে আমি সর্বদা সরলতার পক্ষে তর্ক করব এবং অপ্রয়োজনীয়তা এড়াতে চাই।

এর চেয়ে ভাল কি? ভিউ মডেলটিতে কোনও সংকলন বা সম্পত্তির পরিবর্তন সম্পর্কিত ইভেন্টগুলি সংজ্ঞায়িত করে মডেলটিতে প্রচার করা বা ভিউটির অভ্যন্তরীণভাবে মডেলটি আপডেট করা (ভিউ মডেলের মাধ্যমে)?

নীচের লাইনটি যখনই আপনি কাউকে দাবি দেখছেন যে " আপনি এটি করতে পারবেন না বা এটি " এটি একটি চিহ্ন এটি তারা জানেন না যে তারা কী সম্পর্কে কথা বলছেন।

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

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


7
এই ভাবে চিন্তা করুন। আপনি যদি কোনও বিকাশকারী হিসাবে আপনার মধ্যে মডেলগুলির সাথে একটি .dll গ্রাস করেন তবে অবশ্যই INotifyPropertyChanged সমর্থন করার জন্য সেগুলি পুনরায় লিখবেন না।
লি ট্রেভিল

2
আপনার সাথে দৃ you়ভাবে একমত। আমার মত, আপনি অফিশিয়াল এমভিভিএম ডকুমেন্টেশন < এমএসডিএন.মাইক্রোসফটকম /en-us/library/gg405484%28v=pandp.40%29.aspx > (মডেল বিভাগ) আমাদের সাথে সম্মত তা জানতে পেরে আপনিও সন্তুষ্ট হতে পারেন । :-)
নলডোরিন

"তবে তেহরে জিনিস অর্জনের বিভিন্ন উপায় তবে আমি সর্বদা সরলতার পক্ষে তর্ক করতে এবং অপ্রয়োজনীয়তা এড়াতে চাই।" অনেক গুরুত্বপূর্ণ.
বাসটিয়েন ভান্ডামমে

1
INotifyPropertyChangedSystem.ComponentModelনেমস্পেসের অংশ যা " উপাদান এবং নিয়ন্ত্রণগুলির রান-টাইম এবং ডিজাইনের সময় আচরণ " এর জন্য। মডেলগুলিতে, কেবল ভিউমোডেলগুলিতে ব্যবহার করবেন না INotifyPropertyChanged । দস্তাবেজগুলিতে লিঙ্ক করুন: ডকস.মাইক্রোসফটকম /en-us/dotnet/api/system.componentmodel
ইগর পপভ

1
পুরানো পোস্ট, আমি জানি, তবে এমভিভিএম ব্যবহার করে কোনও নতুন প্রকল্প শুরু করার সময় আমি প্রায়শই এটিতে ফিরে আসি। আমি সম্প্রতি আরও কঠোরভাবে একক দায়িত্বের নীতিটি প্রয়োগ করা শুরু করেছি। একটি মডেল একটি দায়িত্ব আছে। মডেল হতে। আপনি মডেলটিতে INotifyPropertyChanged যোগ করার সাথে সাথে এটি আর একক দায়িত্বের নীতি অনুসরণ করে না। ভিউমোডেল উপস্থিত থাকার পুরো কারণটি হ'ল মডেলটিকে মডেল হতে দেওয়া, মডেলটির একক দায়িত্ব থাকতে দেওয়া।
ছড়া

30

এমভি-ভিএম-এ ভিউমোডেল সর্বদা (মডেল সর্বদা নয়) প্রয়োগগুলি INotifyPropertyChanged

Http://blogs.msdn.com/llobo/archive/2009/05/01/download-mv-vm-project-template-toolkit.aspx থেকে এমভি-ভিএম প্রকল্পের টেম্পলেট / টুলকিটটি দেখুন । এটি DelegateCommandকমান্ডিংয়ের জন্য ব্যবহার করে এবং এটি আপনার এমভি-ভিএম প্রকল্পগুলির জন্য একটি দুর্দান্ত সূচনা টেম্পলেট হওয়া উচিত।


প্রথম বাক্যটি অন্য উত্তরের মতামতগুলি বেশ ভালভাবেই বোঝায়, ইমো। => আপলোড করুন!
j00hi

13

আমি মনে করি এমভিভিএম খুব খারাপভাবে নামকরণ করেছে এবং ভিউমোডেলকে একটি ভিউমোডেল বলার ফলে অনেকগুলি একটি সু-নকশাকৃত আর্কিটেকচারের একটি গুরুত্বপূর্ণ বৈশিষ্ট্যটি মিস করতে পারে, যা একটি ডেটা কনট্রোলার যা তথ্য স্পর্শ করার চেষ্টা করছে তা বিবেচনা করেই নিয়ন্ত্রণ করে।

আপনি যদি ভিউ-মডেলটিকে কোনও ডেটা কনট্রোলার হিসাবে বিবেচনা করেন এবং এমন একটি আর্কিটেকচার বাস্তবায়ন করেন যেখানে আপনার ডেটা কনট্রোলার একমাত্র আইটেম যা ডেটা স্পর্শ করে তবে আপনি কখনই সরাসরি ডেটা স্পর্শ করবেন না, তবে সর্বদা ডেটা কনট্রোলার ব্যবহার করবেন। ডেটা কনট্রোলারটি ইউআইয়ের জন্য দরকারী তবে কেবলমাত্র ইউআইয়ের জন্য প্রয়োজনীয় নয়। এটি ব্যবসায়ের স্তর, ইউআই স্তর ইত্যাদির জন্য ...

DataModel -------- DataController ------ View
                  /
Business --------/

আপনি এই মত একটি মডেল সঙ্গে শেষ। এমনকি ব্যবসায়ের শুধুমাত্র ভিউমোডেল ব্যবহার করে ডেটা স্পর্শ করা উচিত। তারপরে আপনার ধাঁধাটি কেবল চলে যায়।


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

4
আপনি ঠিক ঠিক বলেছেন। ডিজাইন প্যাটারগুলি খুব উচ্চ স্তরের। বেশিরভাগ সময় ডিজাইনের প্যাটার্ন আপনাকে কাজগুলি সঠিকভাবে পরিচালিত করতে পরিচালিত করে, তবে প্রতিবার এবং পরে তারা আপনাকে ভুল পথে ফিরিয়ে দেয়। আপনার কখনই কোনও সঠিক কাজ করা এড়ানো উচিত নয় কারণ এটি আপনার ডিজাইনের ধরণের বাইরে।
ছড়া

এটি আপনার ডেটা কন্ট্রোলারটিকে যেমন এটি নিয়ন্ত্রণ করে এবং ডেটা মডেলটিও ঠেলে দেয় এবং এটি আপডেট করতে বলত।
ছড়া

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

9

আপনি কীভাবে আপনার মডেলটি প্রয়োগ করেছেন তার উপর নির্ভর করে। আমার সংস্থা লটকার সিএসএলএর আইটেমগুলির অনুরূপ ব্যবসায়িক আইটেমগুলি ব্যবহার করে এবং INotifyPropertyChangedপুরো ব্যবসায়ের মডেলটিতে বিস্তৃত ব্যবহার করে ।

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

আমাদের কাছে ভিউ মডেলগুলিও রয়েছে যা প্রয়োজন অনুসারে মডেল থেকে পরিবর্তনগুলি প্রচার করে তবে ভিউ মডেলগুলি নিজেরাই অন্তর্নিহিত মডেল পরিবর্তনগুলি শুনছে।


3
আপনি মডেলটির অনপ্রোপার্টিচেনজড ভিউমোডেলের অনপ্রোপার্টি চেঞ্জডে ঠিক কীভাবে প্রচার করবেন? আমার যখন ভিউমোডেলের মডেলের চেয়ে পৃথক সম্পত্তির নাম রয়েছে তখন আমার একটি সমস্যা আছে - তখন কোনও ধরণের নাম থেকে নাম ম্যাপিং দরকার হবে, তাই না?
মার্টিন কোনিসেক

এটি বাস্তব পরিশীলিত কিছু নয়, আমরা কেবল ইভেন্টগুলিকে এগিয়ে রাখি। আমি মনে করি নামগুলি যদি আলাদা হয় তবে একটি সন্ধানের টেবিল ব্যবহার করা যেতে পারে। যদি পরিবর্তনটি ওয়ান-টু ওয়ান ম্যাপিং না হয়, তবে আপনি কেবল ইভেন্টটি হুক করতে পারেন এবং তারপরে হ্যান্ডলারের প্রয়োজনীয় ইভেন্টগুলি ফায়ার করতে পারেন।
স্টিভ মিচাম

6

আমি পাওলোর জবাবের সাথে একমত, INotifyPropertyChangedমডেলগুলিতে প্রয়োগ পুরোপুরি গ্রহণযোগ্য এবং এমনকি মাইক্রোসফ্ট দ্বারা প্রস্তাবিত -

সাধারণত, মডেলটি এমন সুবিধাগুলি প্রয়োগ করে যা দর্শনকে আবদ্ধ করা সহজ করে তোলে। এর অর্থ সাধারণত এটি সংস্থান INotifyPropertyChangedএবং INotifyCollectionChangedইন্টারফেসের মাধ্যমে পরিবর্তিত বিজ্ঞপ্তি সমর্থন করে । মডেল ক্লাসগুলি যা অবজেক্টগুলির সংগ্রহের প্রতিনিধিত্ব করে সাধারণত ObservableCollection<T>ক্লাস থেকে উদ্ভূত , যা INotifyCollectionChangedইন্টারফেসের একটি বাস্তবায়ন সরবরাহ করে ।

যদিও আপনি সিদ্ধান্ত নিতে চান যে আপনি এই ধরণের বাস্তবায়ন চান কিনা, তবে মনে রাখবেন -

যদি আপনার মডেল ক্লাসগুলি প্রয়োজনীয় ইন্টারফেস প্রয়োগ না করে?

কখনও কখনও আপনি মডেল যে বস্তু বাস্তবায়নে না সঙ্গে কাজ করতে হবে INotifyPropertyChanged, INotifyCollectionChanged, IDataErrorInfo, অথবা INotifyDataErrorInfoইন্টারফেসগুলি। এই ক্ষেত্রে, ভিউ মডেলটিকে মডেল অবজেক্টগুলিকে মোড়ানো এবং ভিউটিতে প্রয়োজনীয় বৈশিষ্ট্যগুলি প্রকাশ করতে হতে পারে। এই বৈশিষ্ট্যগুলির মানগুলি মডেল অবজেক্টগুলির দ্বারা সরাসরি সরবরাহ করা হবে। ভিউ মডেলটি যে বৈশিষ্ট্যগুলি প্রকাশ করে তার জন্য প্রয়োজনীয় ইন্টারফেসগুলি প্রয়োগ করে যাতে ভিউ সহজেই তাদের সাথে ডেটা বাঁধতে পারে।

থেকে নেওয়া - http://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

আমি এমন কিছু প্রকল্পে কাজ করেছি যেখানে আমরা INotifyPropertyChangedআমাদের মডেলগুলিতে প্রয়োগ করি নি এবং এর কারণে আমরা প্রচুর সমস্যার মুখোমুখি হয়েছি; ভিএম-তে সম্পত্তিগুলির অপ্রয়োজনীয় সদৃশ প্রয়োজন ছিল এবং একই সাথে বিএল / ডিএল-এ যাওয়ার আগে আমাদের অন্তর্নিহিত অবজেক্টটি আপডেট করা হয়েছিল (আপডেট হওয়া মান সহ)।

আপনার মডেল অবজেক্টগুলি (একটি সম্পাদনযোগ্য গ্রিড বা তালিকায় বলুন) বা জটিল মডেলগুলি সংগ্রহের সাথে কাজ করার প্রয়োজন হলে আপনি সমস্যার মুখোমুখি হবেন; মডেল অবজেক্টগুলি স্বয়ংক্রিয়ভাবে আপডেট হবে না এবং আপনাকে আপনার ভিএম-তে সমস্ত পরিচালনা করতে হবে।


3

তবে কখনও কখনও (এই উপস্থাপনার লিঙ্ক পাঠ্যের মতো ) মডেলটি পরিষেবা হয়, যা অনলাইনে কিছু ডেটা দিয়ে অ্যাপ্লিকেশন সরবরাহ করে এবং তারপরে আপনাকে নোটিফিকেশনটি জোগাড় করতে হবে যে ইভেন্টগুলি ব্যবহার করে নতুন ডেটা এসেছে বা ডেটা পরিবর্তিত হয়েছে ...


3

আমি মনে করি উত্তরটি যদি আপনি এমভি-ভিএম মেনে চলতে চান তবে তা বেশ স্পষ্ট।

দেখুন: http://msdn.microsoft.com/en-us/library/gg405484(v=PandP.40).aspx

এমভিভিএম প্যাটার্নে, ভিউটি ইউআই এবং যে কোনও ইউআই যুক্তিকে encapsulates, ভিউ মডেলটি উপস্থাপনা যুক্তি এবং রাষ্ট্রকে encapsulate করে এবং মডেলটি ব্যবসায়িক যুক্তি এবং ডেটাকে encapsulates করে।

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


4
উদ্ধৃতিটি ব্যাখ্যার জন্য উন্মুক্ত। আমি মনে করি আপনার উত্তরটি স্পষ্ট করার জন্য আপনার ব্যাখ্যাটি যুক্ত করা উচিত :-)
সেরেন বোইসেন

@ জন ডি: এই নিবন্ধটি কেবল এমভিভিএমের একটি ব্যাখ্যা এবং এটি বাস্তবায়নের একটি উপায় দেয়, এটি এমভিভিএমকে সংজ্ঞায়িত করে না।
আকজোশি

তদুপরি, আপনি যদি পুরো নিবন্ধটি পড়েন তবে এটি মডেল শ্রেণীর সংজ্ঞা দেয়: "সাধারণত, মডেল এমন সুবিধাগুলি প্রয়োগ করে যা দৃশ্যের সাথে আবদ্ধ হওয়া সহজ করে দেয় This এর সাধারণত অর্থ এটি আইএনটিফাইপার্টিচেন্জড এবং আইএনটিফাইও কালেকশন পরিবর্তিত ইন্টারফেসের মাধ্যমে সম্পত্তি এবং সংগ্রহ পরিবর্তিত বিজ্ঞপ্তি সমর্থন করে means "মডেল ক্লাসগুলি যা অবজেক্টেবলের সংগ্রহের প্রতিনিধিত্ব করে সাধারণত পর্যবেক্ষণযোগ্য সংগ্রহ <টি> ক্লাস থেকে উদ্ভূত, যা আইএনটিফাইওকলেকশন চেঞ্জড ইন্টারফেসের একটি বাস্তবায়ন সরবরাহ করে।"
আকজোশি

2

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


2

মডেলগুলিতে আইএনপিসি বাস্তবায়ন করা যদি ভিউমোডেলে মডেলগুলি স্পষ্টভাবে প্রকাশ করা হয়। তবে সাধারণত, ভিউমোডেল মোড়ানো মডেলগুলি মডেলটির জটিলতা হ্রাস করার জন্য তার নিজস্ব ক্লাস (যা বাঁধার জন্য দরকারী নয়)। এই ক্ষেত্রে আইএনপিসিকে ভিউমোডেলে প্রয়োগ করা উচিত।


1

আমি INotifyPropertyChangeএকটি মডেল ইন্টারফেস ব্যবহার করছি । আসলে, কোনও মডেল সম্পত্তি পরিবর্তন কেবলমাত্র ইউআই বা বহিরাগত ক্লায়েন্টের দ্বারা বরখাস্ত করা উচিত।

আমি বেশ কয়েকটি সুবিধা এবং অসুবিধাগুলি লক্ষ্য করেছি:

সুবিধাদি

নোটিফায়ার ব্যবসায়িক মডেলটিতে রয়েছে

  1. ডোমেন চালিত হিসাবে, এটা ঠিক। সিদ্ধান্ত নেওয়া উচিত কখন বাড়াতে হবে এবং কখন নয়।

অসুবিধেও

মডেলের বৈশিষ্ট্যগুলি (কিউটি, হার, কমিশন, টোটালফ্রিজিট) রয়েছে। টোটালফ্রিগটটি পরিমাণ, হার, কমিশন পরিবর্তন ব্যবহার করে গণনা করা হয়।

  1. ডিবি থেকে মান লোড করার সময়, মোট উদ্বেগ গণনা 3 বার (কিউটি, হার, কমিশন) বলা হয়। এটা একবার করা উচিত।

  2. যদি হার হয়, ব্যবসায় স্তরটিতে কিটি নির্ধারিত হয়, আবার বিজ্ঞাপককে বলা হয়।

  3. এটি নিষ্ক্রিয় করার একটি বিকল্প থাকতে হবে, সম্ভবত বেস ক্লাসে। তবে, বিকাশকারীরা এটি করতে ভুলে যেতে পারে।


আপনি তালিকাভুক্ত সমস্ত অসুবিধার কারণে, আমরা কেবলমাত্র সিদ্ধান্ত নিয়েছি যে মডেলগুলিতে INPC প্রয়োগের জন্য আমাদের তুলনামূলকভাবে বড় ডাব্লুপিএফ প্রকল্পে এটি একটি ভুল সিদ্ধান্ত ছিল। তাদের কেবল দৃistence়তা স্তর নিয়ে কাজ করা উচিত। অন্যান্য সমস্ত জিনিস যেমন বৈধতা, পরিবর্তন বিজ্ঞপ্তি এবং গণনা করা বৈশিষ্ট্যগুলি ভিউমোডেলে পরিচালনা করা উচিত। এখন আমি স্পষ্টভাবে বুঝতে পারি যে ভিউমোডেলে মডেল বৈশিষ্ট্যগুলি পুনরাবৃত্তি করা সবসময় ডিআরওয়াই নীতি লঙ্ঘন নয়।
try2fly.b4ucry

1

আমি মনে করি যে এটি সব ব্যবহারের ক্ষেত্রে নির্ভর করে।

যখন আপনার কাছে প্রচুর পরিমাণে সম্পত্তি সহ একটি সাধারণ মডেল থাকে, আপনি এটি INPC প্রয়োগ করতে পারেন। সাধারণভাবে আমি বলতে চাইছি যে এই মডেলটি পোকোর মতো দেখাচ্ছে ।

যদি আপনার মডেল আরও জটিল হয় এবং একটি ইন্টারেক্টিভ মডেল ডোমেনে বাস করে - মডেলগুলি রেফারেন্স করে মডেলগুলি, অন্যান্য মডেলের ইভেন্টগুলিতে সাবস্ক্রাইব করে - মডেল ইভেন্টগুলি আইএনপিসি হিসাবে প্রয়োগ করা একটি দুঃস্বপ্ন।

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

আইএনপিসির সাথে আর একটি ইস্যু। প্রয়োগগুলি নয়, বিমূর্তির উপর নির্ভর করার জন্য আপনার অ্যাপ্লিকেশনগুলি ডিজাইন করা উচিত। এটি সাধারণত ইন্টারফেস ব্যবহার করে করা হয়।

আসুন একই বিমূর্তনের 2 টি পৃথক বাস্তবায়ন দেখে নেওয়া যাক:

public class ConnectionStateChangedEventArgs : EventArgs
{
    public bool IsConnected {get;set;}
}

interface IConnectionManagerINPC : INotifyPropertyChanged
{
    string Name {get;}
    int ConnectionsLimit {get;}
    /*

    A few more properties

    */
    bool IsConnected {get;}
}

interface IConnectionManager
{
    string Name {get;}
    int ConnectionsLimit {get;}
    /*

    A few more properties

    */
    event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged;
    bool IsConnected {get;}
}

এখন দু'জনকেই দেখুন। আইকনেকশনম্যানেজারআইএনপিসি আপনাকে কী বলে? এটির কিছু বৈশিষ্ট্য পরিবর্তিত হতে পারে। আপনি তাদের কোনটি জানেন না। প্রকৃতপক্ষে নকশাটি হ'ল কেবলমাত্র ইস্কনেক্টেড পরিবর্তনগুলি, কারণ বাকিগুলি কেবল পঠনযোগ্য।

বিপরীতে, আইকনেকশন ম্যানেজারের উদ্দেশ্যগুলি স্পষ্ট: "আমি আপনাকে বলতে পারি যে আমার ইসনেক্টেড সম্পত্তির মান পরিবর্তিত হতে পারে"।


1

কেবলমাত্র INotifyPropertyChangeআপনার ভিউ মডেলটিতে ব্যবহার করুন , মডেলটিতে নয়,

মডেলটি সাধারণত IDataErrorInfoবৈধতা ত্রুটিগুলি পরিচালনা করতে ব্যবহার করে তাই আপনার ভিউমডেলে রাখুন এবং আপনি আপনার এমভিভিএম রাস্তায় ডানদিকে রয়েছেন।


1
বিভিন্ন বৈশিষ্ট্যযুক্ত মডেলগুলি সম্পর্কে কী? আপনি ভিএম-তে কোড পুনরাবৃত্তি করছেন।
লুইস

0

মনে করুন যে আপনার দৃষ্টিতে অবজেক্টের রেফারেন্স পরিবর্তন হয়েছে। সঠিক মানগুলি দেখানোর জন্য আপনি কীভাবে সমস্ত বৈশিষ্ট্য আপডেট করার জন্য অবহিত করবেন? কল করা হচ্ছে OnPropertyChangedসব বস্তুর বৈশিষ্ট্যের জন্য আপনার দৃশ্য আমার দৃষ্টিকোণ থেকে আবর্জনা হয়।

তাই কি আমি কি একটি সম্পত্তি পরিবর্তন একটি মান, এবং আমার দৃশ্য আমি বাইন্ডিং ব্যবহার করলে বস্তু নিজেই যে কেউ অবহিত করতে দেওয়া হয় Object.Property1, Object.Property2এবং এর। সেভাবে যদি আমি বর্তমানে আমার দৃষ্টিতে রক্ষিত অবজেক্টটি পরিবর্তন করতে চাই তবে আমি এটিই করি OnPropertyChanged("Object")

বস্তু লোড করার সময় শত শত বিজ্ঞপ্তি এড়াতে, আমার একটি ব্যক্তিগত বুলিয়ান সূচক রয়েছে যা লোডিংয়ের সময় আমি এটি সত্যে সেট করেছিলাম যা বস্তুর থেকে পরীক্ষা করা হয় OnPropertyChangedএবং কিছুই করে না।


0

সাধারণত ভিউমোডেল এটিকে বাস্তবায়ন করবে INotifyPropertyChanged। মডেল কিছু হতে পারে (এক্সএমএল ফাইল, ডাটাবেস বা এমনকি বস্তু)। মডেলটি ভিউমডেলকে ডেটা দেওয়ার জন্য ব্যবহৃত হয়, যা ভিউতে প্রচার করে।

এখানে দেখো


1
emm .. না। মডেল এক্সএমএল ফাইল বা ডাটাবেস হতে পারে না। এবং তথ্য দেওয়ার জন্য মডেল ব্যবহার করা হয় না। নাহলে একে "মডেল" নয় "ডেটা" বলা উচিত ..? মডেল ডেটা বর্ণনা করতে ব্যবহৃত হয়। বেশ স্ব ব্যাখ্যা, তাই না? :)
তারাস

1
আপনার যদি আরও ভাল উত্তর থাকে তবে শেয়ার করুন! আমরা এখানে জ্ঞান ভাগ করে নেওয়ার জন্য এবং প্রতিযোগিতা করার জন্য নয়
অ্যাডাম

0

imho আমি মনে করি ভিউমডেল প্রয়োগগুলি INotifyPropertyChangeএবং মডেলটি একটি পৃথক "স্তরের" উপর বিজ্ঞপ্তি ব্যবহার করতে পারে।

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

তবে আপনি INotifyPropertyChangeযদি আপনার মডেলটিতে ব্যবহার করেন তবে আমি মনে করি যে এটি সরাসরি আপনার দৃষ্টিতে সাবস্ক্রাইব করার পরিবর্তে আপনার ভিউ মডেলটিতে এটি রিলে করা ভাল অনুশীলন। সেক্ষেত্রে ইভেন্টগুলি যখন আপনার মডেলটিতে পরিবর্তিত হয় আপনি কেবলমাত্র ভিউ মডেলটি পরিবর্তন করতে হবে এবং দৃশ্যটি অচ্ছুত থেকে যায়।


0

সমস্ত বৈশিষ্ট্য, যা আমার দৃশ্যের সাথে আবদ্ধ, আমার ভিউমোডেলে (গুলি)। সুতরাং তাদের উচিত INOTifyPropertyChanged ইন্টারফেস বাস্তবায়ন করা। অতএব দর্শন সমস্ত পরিবর্তন পায়।

[এমভিভিএম লাইট টুলকিট ব্যবহার করে, আমি তাদের ভিউমোডেলবেস থেকে উত্তরাধিকার সূত্রে দিতাম]

মডেলটি ব্যবসায়িক যুক্তি ধারণ করে, তবে দেখার সাথে তার কোনও যোগসূত্র নেই। সুতরাং INotifyPropertyChanged ইন্টারফেসের প্রয়োজন নেই।

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