এমভিভিএম অ্যাপ্লিকেশনটিতে কাদের নেভিগেশন নিয়ন্ত্রণ করা উচিত?


33

উদাহরণ # 1: আমার এমভিভিএম অ্যাপ্লিকেশনটিতে আমার দৃষ্টিভঙ্গি প্রদর্শিত হয়েছে (আসুন আলোচনার উদ্দেশ্যে সিলভারলাইট ব্যবহার করুন) এবং আমি একটি বোতামে ক্লিক করি যা আমাকে নতুন পৃষ্ঠায় নিয়ে যেতে পারে।

উদাহরণ # 2: একই ভিউটিতে আরেকটি বোতাম রয়েছে যা ক্লিক করার পরে শিশু উইন্ডোতে একটি ডায়ালগ ভিউ খুলতে হবে (কথোপকথন)।

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

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

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

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

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

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

উত্তর:


21

নেভিগেশন সর্বদা ভিউমোডেলে পরিচালনা করা উচিত।

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

আমার কাছে সাধারণত একটি থাকে ApplicationViewModel, বা ShellViewModelযা আমার আবেদনের সামগ্রিক অবস্থা পরিচালনা করে। এর মধ্যে রয়েছে CurrentPage(যা একটি ভিউমোডেল) এবং পরিচালনা করার কোড ChangePageEvents। (এটি প্রায়শই অন্যান্য অ্যাপ্লিকেশন-বিস্তৃত অবজেক্টের জন্য যেমন কারেন্ট ইউসার বা ত্রুটি-চিহ্নগুলিও ব্যবহৃত হয়)

সুতরাং যে কোনও ভিউমোডেল, যে কোনও জায়গায়, সম্প্রচারিত হলে ChangePageEvent(new SomePageViewModel), এই ShellViewModelবার্তাটি পিকআপ করবে এবং বার্তায় CurrentPageযে পৃষ্ঠাটি নির্দিষ্ট করা হয়েছে তাতে স্যুইচ করবে ।

আপনার আগ্রহী হলে আমি এমভিভিএম সহ নেভিগেশন সম্পর্কে একটি ব্লগ পোস্ট লিখেছিলাম


2
আকর্ষণীয় পদ্ধতির। চারটি মন্তব্য: ১) সিলভারলাইটটি ডেটাপ্লেটে ডেটা টাইপ সম্পত্তি সমর্থন করে না তাই সারণিতে ভিউমোডেলে ডেটাটাইপলেট ম্যাপিং সম্ভব নয়। 2) এটি ভিউ এবং ভিউমোডেলগুলির মধ্যে বহু-বহু-সম্ভাবনাগুলিকে সম্বোধন করে না। 3) এটি চাইল্ড উইন্ডোগুলি হ্যান্ডেল করে না (বা কমপক্ষে আমি কীভাবে তা দেখছি না)। ৪) এটিতে আপনার অ্যাপ্লিকেশন / শেল ভিউমোডেল এবং এটি শিশুদের (নাতি-নাতী, ইত্যাদির) মধ্যে সংযোগ স্থাপন দরকার If
SonOfPirate

এটি বলেছিল, এটি অবশ্যই বিবেচনা করার মতো কিছু।
SonOfPirate

@ সোনফফাইরেট ১) সিলভারলাইট অন্তর্নিহিত ডেটা টেম্প্লেট ম্যাপিং সমর্থন করে না (এখনও), তবে এটি কোনওটিকে সমর্থন করে না DataTemplateSelector, যা আমি সাধারণত সিলভারলাইট অ্যাপসের জন্য ব্যবহার করি। 2) আমি এর আগে বহু-বহু পরিস্থিতিতে ব্যবহার করেছি। উদাহরণস্বরূপ, একটি ভিউমোডেলে একাধিক ভিউ থাকতে পারে, বা এক ভিউ একাধিক ভিউমোডেলগুলির সাথে যুক্ত হতে পারে। পূর্বের উদাহরণের জন্য, rachel53461.wordpress.com/2011/05/28/… দেখুন । পরবর্তী সময়ের জন্য, আপনাকে কেবল আপনার ডেটাটিম্পলেটসলেক্টরে একই ভিউতে একাধিক ভিউমোডেলস মানচিত্র নির্দিষ্ট করতে হবে।
রাচেল

3) এটি একটি প্রাথমিক উদাহরণ। যদি আপনি জানতেন যে আপনার অ্যাপ্লিকেশনটি একাধিক উইন্ডোজ হতে চলেছে, তবে আপনি একাধিক CurrentPages4 হ্যান্ডেল করার জন্য অবশ্যই শেলভিউমোডেলটিকে পরিবর্তন করতে পারবেন ) এটি আবার একটি প্রাথমিক উদাহরণ। বাস্তবে, আমার পেজভিউমোডেলগুলি সমস্ত কিছু বেস শ্রেণীর উপর ভিত্তি করে তৈরি হয়, সুতরাং আমার শেলভিউমোডেল কেবলমাত্র বেস ক্লাস বা ইন্টারফেসের সাথে কাজ করে, যেমন IPageViewModel। ম্যাপিংয়ের পক্ষে সবচেয়ে বড় অগোছালো অংশটি হ'ল ডেটা টেম্প্লেটসলেক্টর যা 40 ভিউমোডেলস থেকে 40 ভিউ মানচিত্র করতে হবে।
রাচেল

@ সোনফফাইরেট আশা করি আপনার কিছু প্রশ্নের উত্তর পেয়েছি। আপনার যদি অন্য থাকে তবে নির্দ্বিধায় আমাকে চ্যাটে দেখুন :)
রাচেল

6

বন্ধ করার স্বার্থে, আমি ভেবেছিলাম যে এই সমস্যাটি সমাধান করার জন্য আমি শেষ পর্যন্ত যে দিকটি বেছে নিয়েছি তা পোস্ট করব।

প্রথম সিদ্ধান্তটি ছিল- সিলভারলাইট পৃষ্ঠা নেভিগেশন ফ্রেমওয়ার্কটি অফ-অফ-বক্স সরবরাহ করা। এই সিদ্ধান্তটি মাইক্রোসফ্ট উইন্ডোজ 8 মেট্রো অ্যাপ্লিকেশনগুলিতে মাইক্রোসফ্ট দ্বারা চালিত হচ্ছে এবং ফোন 7 অ্যাপগুলিতে নেভিগেশনের সাথে সামঞ্জস্যপূর্ণ এমন জ্ঞান সহ একাধিক কারণের ভিত্তিতে ছিল was

এটি কার্যকর করার জন্য, আমি পরের কনভেনশন-ভিত্তিক নেভিগেশন দ্বারা এএসপি.এনইটি এমভিসি যে কাজটি করেছে তার দিকে নজর রেখেছি। ফ্রেম নিয়ন্ত্রণ প্রদর্শনের জন্য 'পৃষ্ঠা' সনাক্ত করতে ইউআরআই ব্যবহার করে। মিলটি সিলভারলাইট অ্যাপে অনুরূপ কনভেনশন-ভিত্তিক পদ্ধতির ব্যবহার করার সুযোগ দিয়েছিল। কৌতুকটি এটি সমস্ত এমভিভিএম উপায়ে একসাথে কাজ করছিল।

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

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

নেভিগেশন সার্ভিসে ফিরে যাচ্ছি। নেভিগেটটো পদ্ধতি লক্ষ্য পৃষ্ঠার নাম স্বীকার করে। ভিউমোডেলগুলির কোনও UI উদ্বেগ না রয়েছে তা নিশ্চিত করতে, ব্যবহৃত নামটি প্রদর্শনের জন্য ভিউমোডেলের নাম। আমি আসলে এমন একটি গণনা তৈরি করেছি যার সাহায্যে প্রতিটি নাব্যযোগ্য ভিউমোডেলের সহায়ক এবং সমস্ত অ্যাপ্লিকেশনে যাদু স্ট্রিংগুলি মুছে ফেলার ক্ষেত্র রয়েছে। উপরে উল্লিখিত ম্যাপিং ফাংশনটি নাম থেকে "ভিউমোডেল" প্রত্যয়টি কেটে ফেলবে, "পৃষ্ঠা" নামের সাথে যুক্ত করবে এবং পুরো নামটি "ভিউজ {নাম} পৃষ্ঠা.এক্স্যামল" এ সেট করবে।

সুতরাং, উদাহরণস্বরূপ, গ্রাহকের বিবরণ ভিউতে নেভিগেট করতে, আমি কল করতে পারি:

NavigationService.NavigateTo(ViewModels.CustomerDetails);

কাস্টমারডেটেলগুলির মান হ'ল "কাস্টমারডেটেলস ভিউমোডেল" যা "ভিউ \ গ্রাহক বিবরণপেজ.এক্স্যামেল" এ ম্যাপ করা হয়েছে।

এই পদ্ধতির সৌন্দর্যটি হ'ল ইউআই সম্পূর্ণরূপে ভিউমোডেলগুলি থেকে ডিকপলড হয় তবে আমাদের কাছে সম্পূর্ণ নেভিগেশন সমর্থন রয়েছে। আমি এখনই আমার অ্যাপ্লিকেশনটিকে আবার যুক্ত করতে পারি এবং যখনই আমি কোনও কোড পরিবর্তন ছাড়াই ফিট দেখি।

আশা করি ব্যাখ্যাটি সাহায্য করবে।


2

রাহেল যা বলেছিলেন তার অনুরূপ, আমার বেশিরভাগ-এমভিভিএম অ্যাপ্লিকেশনটিতে Presenterউইন্ডোজ বা পৃষ্ঠাগুলির মধ্যে স্যুইচগুলি পরিচালনা করতে পারে has রেচেল এই একটি কল ApplicationViewModel, কিন্তু আমার অভিজ্ঞতা, এটা সাধারণত (যেমন প্রাপ্তির বার্তা হিসেবে, উইন্ডোস, ইত্যাদি তৈরি করুন) শুধু চেয়ে আরও অনেক কিছু করার একটি বাঁধাই লক্ষ্য হতে তাই এটি আরো একটি ঐতিহ্যগত মত টেকনিক্যালি এর রয়েছে Presenterবা Controller

আমার অ্যাপ্লিকেশনটিতে, আমার Presenterএকটি দিয়ে শুরু হয় CurrentViewModelPresenterমধ্যে সর্বধরনের যোগাযোগ বিছিন্ন করে Viewএবং ViewModelViewModelমিথস্ক্রিয়া চলাকালীন যে কাজগুলি করতে পারে তার মধ্যে একটি নতুন ফিরিয়ে দেয় ViewModel, যার অর্থ একটি নতুন পৃষ্ঠা বা একটি নতুন Windowপ্রদর্শন করা উচিত। Presenterতৈরি অথবা মুছে যাওয়ার যত্ন নেয় Viewনতুন ViewModelএবং সেটিং DataContext

কোনও ক্রমের ফলাফলটি এও হতে পারে যে একটি ViewModel"সম্পূর্ণ", সেক্ষেত্রে এটি Presenterসনাক্ত করে এবং উইন্ডোটি বন্ধ করে দেয় বা ViewModelএটি ভিএম স্ট্যাকের বাইরে ফেলে দেয় এবং পূর্ববর্তী পৃষ্ঠাটি প্রদর্শন করতে ফিরে যায়।


কীভাবে প্রদর্শন করতে হবে উপস্থাপক জানেন?
SonOfPirate

1
@ সোনফপিরেট - এটি সাধারণত ডাব্লুপিএফ প্রক্রিয়াগুলির মাধ্যমে করা হয়। Presenterশুধু লাঠি ফিরে ViewModelচাক্ষুষ গাছ, এবং WPF উপযুক্ত grabs View, আপ আঙ্গুলসমূহ DataContextচাক্ষুষ গাছে পরিবর্তে, এবং রাখে। আপনি এটি ব্যবহার করে DataTemplateএটি করতে পারেন যা ViewModelতারা কী ধরণের রেন্ডার দেয় তা ঘোষণা করে বা আপনি একটি কাস্টম ডেটা টেম্পলেট নির্বাচক তৈরি করতে পারেন। এটি এখনও ডাব্লুপিএফ বৈশিষ্ট্যগুলির মধ্যে রয়েছে।
স্কট হুইটলক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.