আমি ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে এমন মতামত নিয়ে কাজ করছি যার জন্য অসংখ্য মান রূপান্তর প্রয়োজন। প্রাথমিকভাবে, আমার দর্শন ( এক্সএএমএল শিষ্যদের উপর এই সজীব আলোচনার অংশে অনুপ্রাণিত হয়েছিল) হ'ল আমার এই ভিউর মডেলটি দৃ of ়তার সাথে ডেটা প্রয়োজনীয়তার সমর্থন করার বিষয়ে কঠোরভাবে করা উচিত । এর অর্থ হ'ল ভিজিবিলিটি, ব্রাশ, মাপ ইত্যাদির মতো কোনও তথ্যে ডেটা পরিণত করার জন্য যে কোনও মান রূপান্তর প্রয়োজন, তা মান রূপান্তরকারী এবং বহু-মান রূপান্তরকারীদের দ্বারা পরিচালিত হবে। ধারণামূলকভাবে, এটি বেশ মার্জিত বলে মনে হয়েছিল। ভিউ মডেল এবং ভিউ উভয়েরই স্বতন্ত্র উদ্দেশ্য থাকবে এবং সুন্দরভাবে ডিকোপল হবে। "ডেটা" এবং "চেহারা" এর মধ্যে একটি স্পষ্ট লাইন আঁকানো হবে।
ভাল, এই কৌশলটি "পুরাতন কলেজ চেষ্টা করুন" দেওয়ার পরে, আমি এইভাবে বিকাশ চালিয়ে যেতে চাই কিনা সে সম্পর্কে আমার কিছু সন্দেহ রয়েছে। আমি প্রকৃতপক্ষে মান রূপান্তরকারীদের ডাম্প করার এবং দৃ model়ভাবে ভিউ মডেলের হাতে সমস্ত মান রূপান্তরকরণের জন্য দায়বদ্ধ করার বিষয়টি বিবেচনা করছি।
মান রূপান্তরকারীদের ব্যবহারের বাস্তবতা পরিষ্কারভাবে পৃথক করা উদ্বেগগুলির আপাত মান পর্যন্ত মাপছে বলে মনে হচ্ছে না। মান রূপান্তরকারীদের সাথে আমার বৃহত্তম সমস্যাটি হ'ল তারা ব্যবহার করতে ক্লান্ত। আপনাকে একটি নতুন শ্রেণি তৈরি করতে হবে, প্রয়োগ করতে হবে IValueConverter
বা সঠিক ধরণের IMultiValueConverter
থেকে মান বা মানগুলি নিক্ষেপ করতে হবে object
, DependencyProperty.Unset
(কমপক্ষে বহু-মান রূপান্তরকারীদের জন্য) পরীক্ষা করতে হবে, রূপান্তর যুক্তিটি লিখতে হবে, একটি উত্স অভিধানে রূপান্তরকারীকে নিবন্ধভুক্ত করতে হবে (নীচে আপডেট দেখুন ], এবং পরিশেষে, বরং ভার্ভোজ এক্সএএমএল ব্যবহার করে কনভার্টারটি সংযুক্ত করুন (যার ফলে উভয়কে বাঁধাই করার জন্য এবং রূপান্তরকারীর নামের জন্য যাদু স্ট্রিং ব্যবহার করতে হবে)[নীচে আপডেট দেখুন]। ডিবাগিং প্রক্রিয়াটিও কোনও পিকনিক নয়, কারণ ত্রুটি বার্তাগুলি প্রায়শই গুপ্ত থাকে, বিশেষত ভিজ্যুয়াল স্টুডিওর ডিজাইন মোড / এক্সপ্রেশন মিশ্রণে।
এটি বলার অপেক্ষা রাখে না যে বিকল্প - সমস্ত মান রূপান্তরগুলির জন্য দর্শন মডেলকে দায়ী করা - এটি একটি উন্নতি। এটি খুব ভাল অন্যদিকে ঘাস সবুজ হয়ে উঠার বিষয় হতে পারে। উদ্বেগগুলির মার্জিত বিভাজনটি হারাতে ছাড়াও, আপনাকে উত্পন্ন বৈশিষ্ট্যগুলির একটি গুচ্ছ লিখতে হবে এবং RaisePropertyChanged(() => DerivedProperty)
বেস বৈশিষ্ট্য নির্ধারণের সময় আপনি আন্তরিকতার সাথে কল করতে হবে, যা কোনও অপ্রীতিকর রক্ষণাবেক্ষণের সমস্যা হিসাবে প্রমাণিত হতে পারে।
নীচেরটি আমি ভিউ মডেলগুলিকে রূপান্তর যুক্তি পরিচালনা করতে এবং মান রূপান্তরকারীদের থেকে দূরে সরিয়ে দেওয়ার মুনাফা ও বিবাদগুলি একসাথে রেখেছি:
- পেশাদাররা:
- মাল্টি-রূপান্তরকারীগুলি অপসারণের পরে কম মোট বাইন্ডিংগুলি
- কম যাদু স্ট্রিং (বাঁধাই পথ
+ রূপান্তরকারী সংস্থার নাম) প্রতিটি রূপান্তরকারী আর রেজিস্ট্রেশন (প্লাস এই তালিকা বজায় রাখা)- প্রতিটি রূপান্তরকারী লিখতে কম কাজ (কোন প্রয়োগকারী ইন্টারফেস বা ingালাই প্রয়োজন)
- রূপান্তরগুলির সাহায্যে সহজে নির্ভরতা ইনজেক্ট করতে পারে (উদাহরণস্বরূপ, রঙের টেবিলগুলি)
- এক্সএএমএল মার্কআপটি কম ভার্বোস এবং পড়া সহজ
- রূপান্তরকারী পুনরায় ব্যবহার এখনও সম্ভব (যদিও কিছু পরিকল্পনা প্রয়োজন)
- DependencyProperty.Unset (রহস্যজনক সমস্যাগুলির সাথে মাল্টি-ভ্যালু রূপান্তরকারীগুলির সাথে আমি লক্ষ্য করেছি)
* স্ট্রাইকথ্রুগুলি এমন সুবিধাগুলি নির্দেশ করে যা আপনি মার্কআপ এক্সটেনশনগুলি ব্যবহার করলে অদৃশ্য হয়ে যায় (নীচে আপডেট দেখুন)
- কনস:
- ভিউ মডেল এবং দর্শনগুলির মধ্যে শক্তিশালী সংযোগ (উদাহরণস্বরূপ, বৈশিষ্ট্যগুলি অবশ্যই দৃশ্যমানতা এবং ব্রাশের মতো ধারণাগুলি নিয়ে কাজ করবে)
- প্রতিটি বাঁধাইয়ের জন্য প্রত্যক্ষ ম্যাপিংয়ের অনুমতি দেওয়ার জন্য আরও মোট সম্পত্তি
(নীচে আপডেট 2 দেখুন)RaisePropertyChanged
প্রতিটি উত্পন্ন সম্পত্তি জন্য কল করা আবশ্যক- রূপান্তরটি কোনও ইউআই উপাদানের সংস্থার উপর নির্ভর করে এখনও রূপান্তরকারীদের উপর নির্ভর করতে হবে
সুতরাং, আপনি সম্ভবত বলতে পারেন, এই সমস্যাটি নিয়ে আমার কিছুটা জ্বলজ্বল রয়েছে। আমি কেবল রিফ্যাক্টরিংয়ের রাস্তায় যেতে খুব দ্বিধাগ্রস্থ হয়েছি যে কোডিং প্রক্রিয়াটি ঠিক ততটাই অদক্ষ ও ক্লান্তিকর যে আমি মান রূপান্তরকারী ব্যবহার করি বা আমার ভিউ মডেলে অসংখ্য মান রূপান্তর বৈশিষ্ট্য প্রকাশ করি।
আমি কি কোনও উপকার / ধারণা অনুভব করছি? যাঁরা উভয়ই মান রূপান্তরকরণের মাধ্যম চেষ্টা করেছেন, কোনটি আপনার পক্ষে আরও ভাল কাজ করেছে এবং কেন? অন্য কোন বিকল্প আছে? (শিষ্যরা টাইপ বর্ণনাকারী সরবরাহকারীদের সম্পর্কে কিছু উল্লেখ করেছিলেন, তবে তারা কী বলছে সে সম্পর্কে আমি কোনও হ্যান্ডেল পাইনি this এ সম্পর্কে কোনও অন্তর্দৃষ্টি প্রশংসিত হবে))
হালনাগাদ
আমি আজ খুঁজে পেয়েছি যে মান রূপান্তরকারীগুলির নিবন্ধকরণের প্রয়োজনীয়তা নির্ধারণের জন্য "মার্কআপ এক্সটেনশন" নামক কিছু ব্যবহার করা সম্ভব। প্রকৃতপক্ষে, এটি কেবল তাদের নিবন্ধকরণের প্রয়োজনকেই দূর করে না, তবে এটি টাইপ করার সময় এটি রূপান্তরকারী নির্বাচনের জন্য প্রকৃতপক্ষে ইন্টেলিজেন্স সরবরাহ করে Converter=
। এখানে আমার নিবন্ধটি শুরু হয়েছে: http://www.wpftutorial.net/ValueConverters.html ।
মার্কআপ এক্সটেনশানটি ব্যবহারের দক্ষতা আমার উপকার ও বিবাদী তালিকা এবং উপরে আলোচনার কিছুটা ভারসাম্যকে পরিবর্তন করে (স্ট্রাইকথ্রুগুলি দেখুন)।
এই প্রকাশের ফলস্বরূপ, আমি একটি হাইব্রিড সিস্টেমের সাথে পরীক্ষা করছি যেখানে আমি রূপান্তরকারীগুলি ব্যবহার করি BoolToVisibility
এবং আমি যা কল করি MatchToVisibility
এবং অন্যান্য সমস্ত রূপান্তরগুলির জন্য ভিউ মডেলটি ব্যবহার করি। ম্যাচটোভিজিবিলিটি মূলত একটি রূপান্তরকারী যা আমাকে পরীক্ষা করতে দেয় যে সীমাবদ্ধ মানটি (সাধারণত একটি এনাম) এক্সএএমএল-তে নির্দিষ্ট এক বা একাধিক মানের সাথে মেলে কিনা।
উদাহরণ:
Visibility="{Binding Status, Converter={vc:MatchToVisibility
IfTrue=Visible, IfFalse=Hidden, Value1=Finished, Value2=Canceled}}"
মূলত এটি যা করে তা হ'ল স্থিতিটি শেষ বা বাতিল হয়েছে কিনা তা পরীক্ষা করা। যদি তা হয়, তবে দৃশ্যমানতাটি "দৃশ্যমান" এ সেট হয়ে যায়। অন্যথায়, এটি "গোপনে" সেট হয়ে যায়। এটি একটি খুব সাধারণ দৃশ্যে পরিণত হয়েছিল এবং এই রূপান্তরকারীটি আমার ভিউ মডেলটিতে প্রায় 15 টি সম্পত্তি সংরক্ষণ করেছে (প্লাস সম্পর্কিত RaisePropertyChanged বিবৃতি)। মনে রাখবেন যে আপনি যখন টাইপ করবেন Converter={vc:
, তখন "ম্যাচটোভিজিবিলিটি" একটি ইন্টেলিজেন্স মেনুতে প্রদর্শিত হবে। এটি লক্ষণীয়ভাবে ত্রুটির সম্ভাবনা হ্রাস করে এবং মান রূপান্তরকারীগুলিকে কম ক্লান্তিকর করে তোলে (আপনি যে মান রূপান্তর চান তার নামটি মনে রাখতে বা সন্ধান করতে হবে না)।
আপনি যদি কৌতূহলী হন তবে আমি নীচের কোডটি পেস্ট করব। এই বাস্তবায়ন এক গুরুত্বপূর্ণ বৈশিষ্ট্য MatchToVisibility
এটি যদি বাউন্ড মান একটি কিনা দেখতে পরীক্ষা হয় enum
, এবং যদি তা না হয়, এটা চেক নিশ্চিত করতে Value1
, Value2
ইত্যাদি এছাড়াও একই ধরণের enums হয়। এটি এনামের কোনও মান ভুল টাইপ করে কিনা তা একটি ডিজাইন-সময় এবং রান-টাইম চেক সরবরাহ করে। এটি একটি সংকলন-সময় চেক করতে উন্নত করতে, আপনি পরিবর্তে নিম্নলিখিতটি ব্যবহার করতে পারেন (আমি এটি হাত দ্বারা টাইপ করেছি তাই আমি যদি কোনও ভুল হয়ে থাকে তবে আমাকে ক্ষমা করুন):
Visibility="{Binding Status, Converter={vc:MatchToVisibility
IfTrue={x:Type {win:Visibility.Visible}},
IfFalse={x:Type {win:Visibility.Hidden}},
Value1={x:Type {enum:Status.Finished}},
Value2={x:Type {enum:Status.Canceled}}"
যদিও এটি নিরাপদ, এটি আমার পক্ষে উপযুক্ত হওয়ার পক্ষে খুব ভার্জোজ ver আমি কেবল ভিউ মডেলের একটি সম্পত্তি ব্যবহার করতে পারি যদি আমি এটি করতে যাচ্ছি। যাইহোক, আমি খুঁজে পেয়েছি যে ডিজাইন-সময় চেকটি আমি এ পর্যন্ত চেষ্টা করেছি এমন দৃশ্যের জন্য পুরোপুরি পর্যাপ্ত।
এখানে কোড MatchToVisibility
[ValueConversion(typeof(object), typeof(Visibility))]
public class MatchToVisibility : BaseValueConverter
{
[ConstructorArgument("ifTrue")]
public object IfTrue { get; set; }
[ConstructorArgument("ifFalse")]
public object IfFalse { get; set; }
[ConstructorArgument("value1")]
public object Value1 { get; set; }
[ConstructorArgument("value2")]
public object Value2 { get; set; }
[ConstructorArgument("value3")]
public object Value3 { get; set; }
[ConstructorArgument("value4")]
public object Value4 { get; set; }
[ConstructorArgument("value5")]
public object Value5 { get; set; }
public MatchToVisibility() { }
public MatchToVisibility(
object ifTrue, object ifFalse,
object value1, object value2 = null, object value3 = null,
object value4 = null, object value5 = null)
{
IfTrue = ifTrue;
IfFalse = ifFalse;
Value1 = value1;
Value2 = value2;
Value3 = value3;
Value4 = value4;
Value5 = value5;
}
public override object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
var ifTrue = IfTrue.ToString().ToEnum<Visibility>();
var ifFalse = IfFalse.ToString().ToEnum<Visibility>();
var values = new[] { Value1, Value2, Value3, Value4, Value5 };
var valueStrings = values.Cast<string>();
bool isMatch;
if (Enum.IsDefined(value.GetType(), value))
{
var valueEnums = valueStrings.Select(vs => vs == null ? null : Enum.Parse(value.GetType(), vs));
isMatch = valueEnums.ToList().Contains(value);
}
else
isMatch = valueStrings.Contains(value.ToString());
return isMatch ? ifTrue : ifFalse;
}
}
এখানে কোড BaseValueConverter
// this is how the markup extension capability gets wired up
public abstract class BaseValueConverter : MarkupExtension, IValueConverter
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
public abstract object Convert(
object value, Type targetType, object parameter, CultureInfo culture);
public virtual object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
এখানে ToEnum এক্সটেনশন পদ্ধতি
public static TEnum ToEnum<TEnum>(this string text)
{
return (TEnum)Enum.Parse(typeof(TEnum), text);
}
আপডেট 2
যেহেতু আমি এই প্রশ্নটি পোস্ট করেছি, আমি একটি মুক্ত-উত্স প্রকল্প জুড়ে এসেছি যা বৈশিষ্ট্য এবং নির্ভরশীল সম্পত্তিগুলির জন্য নোটিফাইপ্রোপার্টি চেঞ্জড কোড ইনজেক্ট করতে "আইএল বয়ন" ব্যবহার করে। এটি "স্টেরয়েডগুলিতে মান রূপান্তরকারী" হিসাবে দর্শনের মডেলটির জোশ স্মিথের দৃষ্টি বাস্তবায়নকে পরম বাতাসে পরিণত করে। আপনি কেবল "অটো-ইমপ্লিমেন্টেড প্রোপার্টি" ব্যবহার করতে পারেন, এবং তাঁতীরা বাকী কাজটি করবেন।
উদাহরণ:
আমি যদি এই কোডটি প্রবেশ করি:
public string GivenName { get; set; }
public string FamilyName { get; set; }
public string FullName
{
get
{
return string.Format("{0} {1}", GivenName, FamilyName);
}
}
... এটিই সংকলিত হয়:
string givenNames;
public string GivenNames
{
get { return givenName; }
set
{
if (value != givenName)
{
givenNames = value;
OnPropertyChanged("GivenName");
OnPropertyChanged("FullName");
}
}
}
string familyName;
public string FamilyName
{
get { return familyName; }
set
{
if (value != familyName)
{
familyName = value;
OnPropertyChanged("FamilyName");
OnPropertyChanged("FullName");
}
}
}
public string FullName
{
get
{
return string.Format("{0} {1}", GivenName, FamilyName);
}
}
আপনাকে কোড টাইপ করতে, পড়তে হবে, অতীতে স্ক্রোল করতে হবে ইত্যাদি পরিমাণে এটি একটি বিশাল সঞ্চয় More আরও গুরুত্বপূর্ণ, যদিও এটি আপনাকে আপনার নির্ভরতাগুলি কী তা নির্ধারণ করতে বাঁচায়। FullName
শ্রমসাধ্যভাবে RaisePropertyChanged()
কলগুলিতে যোগ করার জন্য নির্ভরতার শৃঙ্খলে না গিয়ে আপনি নতুন "সম্পত্তি পেয়ে" যুক্ত করতে পারেন ।
এই উন্মুক্ত উত্স প্রকল্পটি কী বলা হয়? আসল সংস্করণটিকে বলা হয় "নোটিফাইপ্রোপার্টিওয়েভার", তবে এর পরে মালিক (সাইমন পটার) আইএল তাঁতিদের পুরো সিরিজের হোস্টিংয়ের জন্য "ফডি" নামে একটি প্ল্যাটফর্ম তৈরি করেছেন। এই নতুন প্ল্যাটফর্মের অধীনে নোটিফাইপার্টিভিয়ারের সমতুল্যকে প্রপার্টি চেঞ্জড.ফডি বলা হয়।
- দেহী সেটআপ নির্দেশাবলী: http://code.google.com/p/fody/wiki/SampleUsage ("সম্পত্তি পরিবর্তন" এর সাথে " ভার্চুয়ালিটি " প্রতিস্থাপন করুন)
- প্রপার্টিচেন্জড.ফৌডি প্রকল্প সাইট: http://code.google.com/p/propertychanged/
আপনি যদি NotifyPropertyWeaver (যা ইনস্টল করতে কিছুটা সহজ, তবে ভবিষ্যতে বাগ ফিক্সের বাইরেও আপডেট হওয়া প্রয়োজন না) নিয়ে যেতে পছন্দ করেন, এখানে প্রকল্প সাইটটি: http://code.google.com/p/ notifypropertyweaver /
যে কোনও উপায়ে, এই আইএল তাঁত সমাধানগুলি স্টেরয়েড বনাম মান রূপান্তরকারীগুলিতে ভিউ মডেলের মধ্যে বিতর্কে ক্যালকুলাসকে সম্পূর্ণ পরিবর্তন করে change
MatchToVisibility
কিছু সাধারণ মোড স্যুইচ সক্ষম করার সুবিধাজনক উপায় বলে মনে হয়েছিল (আমার বিশেষত একটি ভিউ রয়েছে যা অনেকগুলি অংশের সাথে চালু এবং বন্ধ করা যায় most বেশিরভাগ ক্ষেত্রে, ভিউটির অংশগুলি x:Name
মোডের সাথে মেলে এমনকি লেবেলযুক্ত থাকে ) তারা এর সাথে সঙ্গতি বোধ করে।) এটি আমার কাছে সত্যই ঘটেনি যে এটি "ব্যবসায়িক যুক্তি", তবে আমি আপনার মন্তব্যটি কিছু চিন্তাভাবনা করব।
BooleanToVisibility
দৃশ্যমানতার সাথে সম্পর্কিত এমন একটি মান নেয় (সত্য / মিথ্যা) এবং এটিকে অন্য একটিতে অনুবাদ করে। এটি একটি আদর্শ ব্যবহারের মতো বলে মনে হচ্ছেValueConverter
। অন্যদিকে, (কী ধরণের আইটেমগুলি দৃশ্যমান হওয়া উচিত) এMatchToVisibility
ব্যবসার যুক্তিটিকে এনকোডিং করছেView
। আমার মতে এই যুক্তিটি নীচে চাপানো উচিতViewModel
, বা আরও যেদিকে আমি ডাকেEditModel
। ব্যবহারকারী যা দেখতে পাবে তা পরীক্ষার অধীনে থাকা উচিত।