একটি (কাস্টম) নির্ভরতা সম্পত্তি এবং ডাব্লুপিএফ-এ সংযুক্ত সম্পত্তির মধ্যে পার্থক্য কী? প্রতিটি জন্য ব্যবহার কি? সাধারণত বাস্তবায়নগুলি কীভাবে পৃথক হয়?
একটি (কাস্টম) নির্ভরতা সম্পত্তি এবং ডাব্লুপিএফ-এ সংযুক্ত সম্পত্তির মধ্যে পার্থক্য কী? প্রতিটি জন্য ব্যবহার কি? সাধারণত বাস্তবায়নগুলি কীভাবে পৃথক হয়?
উত্তর:
যেহেতু আমি বিষয়টি সম্পর্কে কোনও ডকুমেন্টেশন খুব কম পেয়েছি, সোর্স কোডটির আশেপাশে এটি কিছুটা ঝুঁকি নিয়েছিল , তবে এখানে একটি উত্তর দেওয়া হয়েছে।
নিয়মিত এবং সংযুক্ত সম্পত্তি হিসাবে নির্ভরতা সম্পত্তি নিবন্ধকরণের মধ্যে পার্থক্য রয়েছে, "দার্শনিক" এক ব্যতীত ( নিয়মিত বৈশিষ্ট্যগুলি ঘোষণার ধরণ এবং এর উদ্দীপক ধরণের দ্বারা ব্যবহৃত হবার উদ্দেশ্যে চিহ্নিত করা হয়, সংযুক্ত বৈশিষ্ট্যগুলি হিসাবে ব্যবহৃত হবে স্বেচ্ছাসেবক DependencyObject
দৃষ্টান্তগুলিতে এক্সটেনশনগুলি )। "দার্শনিক", কারণ @ মার্কেআইভি যেমন @ রিডকপসির উত্তরে তার মন্তব্যে লক্ষ্য করেছেন, নিয়মিত বৈশিষ্ট্যগুলিও স্বেচ্ছাসেবী DependencyObject
উদাহরণ হিসাবে ব্যবহার করা যেতে পারে ।
অধিকন্তু, সংযুক্ত সম্পত্তিটি "নির্ভরশীলতার ধরণের ধরণ" বলে উল্লেখ করে আমি অন্যান্য উত্তরের সাথে একমত হতে পারি না কারণ এটি বিভ্রান্তিকর - নির্ভরতা বৈশিষ্ট্যের কোনও "প্রকার" নেই। সম্পত্তিটি সংযুক্ত হিসাবে নিবন্ধিত হয়েছে কিনা তা কাঠামোটির কোনও যত্ন নেই - এটি নির্ধারণ করা এমনকি সম্ভব নয় (এই তথ্যটি রেকর্ড করা হয়নি, কারণ এটি অপ্রাসঙ্গিক)। প্রকৃতপক্ষে, সমস্ত সম্পত্তিগুলি সংযুক্ত সম্পত্তি হিসাবে নিবন্ধিত হয় তবে নিয়মিত ক্ষেত্রে কিছু অতিরিক্ত জিনিস করা হয় যা তাদের আচরণকে সামান্য পরিবর্তন করে।
উত্স কোডটি নিজে যাবার সমস্যাটি আপনাকে বাঁচাতে এখানে কী ঘটে থাকে তার একটি সেদ্ধ ডাউন সংস্করণ।
কোনও মেটাডেটা নির্দিষ্ট না করে কল করে কোনও সম্পত্তি নিবন্ধন করার সময়
DependencyProperty.Register(
name: "MyProperty",
propertyType: typeof(object),
ownerType: typeof(MyClass))
উৎপাদ ঠিক একই কলিং যেমন ফলাফলের
DependencyProperty.RegisterAttached(
name: "MyProperty",
propertyType: typeof(object),
ownerType: typeof(MyClass))
তবে মেটাডেটা নির্দিষ্ট করার সময়, কল করা হচ্ছে
DependencyProperty.Register(
name: "MyProperty",
propertyType: typeof(object),
ownerType: typeof(MyClass),
typeMetadata: new FrameworkPropertyMetadata
{
CoerceValueCallback = CoerceCallback,
DefaultValue = "default value",
PropertyChangedCallback = ChangedCallback
});
কল করার সমতুল্য
var property = DependencyProperty.RegisterAttached(
name: "MyProperty",
propertyType: typeof(object),
ownerType: typeof(MyClass),
defaultMetadata: new PropertyMetadata
{
DefaultValue = "default value",
});
property.OverrideMetadata(
forType: typeof(MyClass),
typeMetadata: new FrameworkPropertyMetadata
{
CoerceValueCallback = CoerceCallback,
DefaultValue = "default value",
PropertyChangedCallback = ChangedCallback
});
নিয়মিত এবং সংযুক্ত নির্ভরতা বৈশিষ্ট্যের মধ্যে কী (এবং কেবলমাত্র) পার্থক্য হ'ল DependencyProperty.DefaultMetadata সম্পত্তি মাধ্যমে উপলব্ধ ডিফল্ট মেটাডেটা ata এমনকি মন্তব্য বিভাগে এটি উল্লেখ করা হয়েছে :
Nonattached বৈশিষ্ট্যের জন্য, মেটাডেটা এই সম্পত্তি দ্বারা ফিরে ধরনের উদ্ভূত ধরনের কাস্ট করা যাবে না PropertyMetadata টাইপ এমনকি যদি সম্পত্তি মূলত একটি উদ্ভূত মেটাডেটা প্রকার সাথে নিবন্ধিত করা হয়। আপনি যদি আসলভাবে নিবন্ধিত মেটাডেটা এর মূল সম্ভাব্য উত্পন্ন মেটাডেটা প্রকার সহ চান তবে গেটমেটাদাতা (প্রকার) এর পরিবর্তে কল করুন, প্যারামিটার হিসাবে মূল নিবন্ধকরণ প্রকারটি পাস করে।
সংযুক্ত বৈশিষ্ট্যগুলির জন্য, এই সম্পত্তি দ্বারা ফেরত মেটাডেটার ধরণটি মূল রেজিস্টারঅ্যাটচ নিবন্ধকরণ পদ্ধতিতে প্রদত্ত প্রকারের সাথে মিলবে ।
এটি প্রদত্ত কোডে স্পষ্টভাবে দৃশ্যমান। নিবন্ধকরণ পদ্ধতিতে সামান্য ইঙ্গিতগুলিও গোপন করা হয়, যেমন RegisterAttached
মেটাডেটা প্যারামিটারটির নামকরণ করা হয়েছে defaultMetadata
, তবে এর জন্য Register
নামকরণ করা হয়েছে typeMetadata
। সংযুক্ত বৈশিষ্ট্যের জন্য সরবরাহিত মেটাডেটা ডিফল্ট মেটাডেটা হয়ে যায়। তবে নিয়মিত বৈশিষ্ট্যগুলির ক্ষেত্রে, ডিফল্ট মেটাডেটা সর্বদা PropertyMetadata
কেবলমাত্র DefaultValue
সেট (একটি সরবরাহিত মেটাডেটা থেকে বা স্বয়ংক্রিয়ভাবে) এর সাথে একটি নতুন ঘটনা । কেবলমাত্র পরবর্তী পরবর্তী কলগুলি OverrideMetadata
সরবরাহিত মেটাডেটা ব্যবহার করে।
প্রধান ব্যবহারিক পার্থক্য নেই নিয়মিত বৈশিষ্ট্য ক্ষেত্রে CoerceValueCallback
এবং PropertyChangedCallback
প্রযোজ্য শুধুমাত্র টাইপ মালিক টাইপ হিসেবে ঘোষণা থেকে প্রাপ্ত ধরনের জন্য, এবং সংযুক্ত বৈশিষ্ট্যের জন্য তারা করছি প্রযোজ্য সব ধরনের। উদাহরণস্বরূপ:
var d = new DependencyObject();
d.SetValue(SomeClass.SomeProperty, "some value");
নিবন্ধিত PropertyChangedCallback
বলা হবে যদি সম্পত্তি একটি সংযুক্ত সম্পত্তি হিসাবে নিবন্ধিত হয়েছিল, কিন্তু বলা যাবে না যদি এটি একটি নিয়মিত সম্পত্তি হিসাবে নিবন্ধিত হয়। একই যায় CoerceValueCallback
।
একটি গৌণ পার্থক্য সত্য OverrideMetadata
সরবরাহ করে যে সরবরাহ করা ধরণের থেকে উদ্ভূত হয় DependencyObject
। বাস্তবে এটা মানে নিয়মিত বৈশিষ্ট্যের জন্য মালিক টাইপ আহরণ আবশ্যক থেকে DependencyObject
হতে পারে যেহেতু সংযুক্ত বৈশিষ্ট্যের জন্য এ কোন (স্ট্যাটিক ক্লাস, structs মধ্যে, enums, প্রতিনিধিদের ইত্যাদি সহ) প্রকার।
এছাড়া @ MarqueIV এর পরামর্শ, বিভিন্ন অনুষ্ঠান উপর আমি মতামত জুড়ে আসা করেছি যে নিয়মিত এবং সংযুক্ত বৈশিষ্ট্যাবলী তারা ব্যবহার করা যেতে পারে পার্থক্য XAML । যথা, নিয়মিত বৈশিষ্ট্যগুলিতে সংযুক্ত বৈশিষ্ট্যগুলির দ্বারা সুস্পষ্ট নামের সিনট্যাক্সের বিপরীতে অন্তর্নিহিত নাম বাক্য গঠন প্রয়োজন। এটি প্রযুক্তিগতভাবে সত্য নয় , যদিও অনুশীলনে সাধারণত এটি হয়। স্বচ্ছতার জন্য:
<!-- Implicit property name -->
<ns:SomeClass SomeProperty="some value" />
<!-- Explicit property name -->
<DependencyObject ns:SomeClass.SomeProperty="some value" />
ইন বিশুদ্ধ XAML , শুধুমাত্র এই syntaxes ব্যবহার শাসক নিয়ম অনুসরণ করছে:
এই শর্তগুলি সন্তুষ্ট করা ব্যাকিং নির্ভরতা সম্পত্তি নিয়মিত বা সংযুক্ত হিসাবে নিবন্ধিত ছিল কিনা তা বিবেচনা না করেই আপনাকে সংশ্লিষ্ট সিনট্যাক্স ব্যবহার করতে সক্ষম করে।
এখন উল্লিখিত ভুল ধারণাটি এই কারণে তৈরি হয়েছে যে বিশাল সংখ্যক টিউটোরিয়াল (একসাথে স্টক ভিজ্যুয়াল স্টুডিও কোড স্নিপেটস) আপনাকে নিয়মিত নির্ভরতা সম্পত্তিগুলির জন্য সিএলআর সম্পত্তি ব্যবহার করতে এবং সংযুক্তদের জন্য সেট / অ্যাক্সেসর পেতে / সেট করার নির্দেশ দেয়। তবে আপনাকে একই সাথে দুটি ব্যবহার করতে বাধা দেওয়ার কিছু নেই, যা আপনার পছন্দসই সিনট্যাক্স ব্যবহার করার অনুমতি দেয়।
সংযুক্ত বৈশিষ্ট্যগুলি এক প্রকার নির্ভরশীল সম্পত্তি। পার্থক্য হ'ল তারা কীভাবে ব্যবহার হচ্ছে।
একটি সংযুক্ত সম্পত্তি সহ, সম্পত্তিটি এমন শ্রেণীর উপর সংজ্ঞায়িত করা হয় যা একই বর্গ নয় যার জন্য এটি ব্যবহৃত হচ্ছে। এটি সাধারণত বিন্যাসের জন্য ব্যবহৃত হয়। প্যানেল.জেড ইন্ডেক্স বা গ্রিড Good সম্পত্তিটি বোতামের দৃষ্টান্তের সাথে "সংযুক্ত" রয়েছে।
এটি কোনও ধারককে, উদাহরণস্বরূপ, এমন কোনও বৈশিষ্ট্য তৈরি করতে দেয় যা কোনও ইউআইলেট উপাদান ব্যবহার করতে পারে।
বাস্তবায়নের পার্থক্য হিসাবে - এটি সম্পত্তির সংজ্ঞা দেওয়ার সময় রেজিস্টার বনাম রেজিস্টারঅ্যাটচ করা মূলত কেবল বিষয়।
সংযুক্ত বৈশিষ্ট্যগুলি মূলত ধারক উপাদানগুলির জন্য বোঝানো হয় like যেমন আপনার গ্রিড থাকে এবং আপনার গ্রিড থাকে তবে এখন এটি গ্রিড উপাদানটির একটি সংযুক্ত সম্পত্তি হিসাবে বিবেচিত। গ্রিডে রাখুন।
নির্ভরতা সম্পত্তি হ'ল সম্পত্তিটি মূলত অন্য কোনও শ্রেণির অন্তর্গত এবং অন্য শ্রেণিতে ব্যবহৃত হয়। উদাহরণস্বরূপ: আপনার এখানে যেমন একটি আয়তক্ষেত্র রয়েছে উচ্চতা এবং প্রস্থ আয়তক্ষেত্রের নিয়মিত বৈশিষ্ট্য, তবে বাম এবং শীর্ষটি নির্ভরতা সম্পত্তি কারণ এটি ক্যানভাস শ্রেণীর অন্তর্গত।
সংযুক্ত বৈশিষ্ট্যগুলি একটি বিশেষ ধরণের নির্ভরতা প্রপার্টি। তারা আপনাকে এমন কোনও জিনিসের সাথে একটি মান সংযুক্ত করার অনুমতি দেয় যা এই মান সম্পর্কে কিছুই জানে না। এই ধারণার জন্য একটি ভাল উদাহরণ লেআউট প্যানেল। প্রতিটি লেআউট প্যানেলের তার শিশু উপাদানগুলি সারিবদ্ধ করার জন্য বিভিন্ন ডেটা প্রয়োজন। ক্যানভাসের শীর্ষ এবং বাম প্রয়োজন, ডকপ্যানেলের প্রয়োজন ডক ইত্যাদি Since সুতরাং আপনি দেখুন, সমস্ত ডাব্লুপিএফ নিয়ন্ত্রণগুলিতে এই সমস্ত সম্পত্তি থাকা সম্ভব নয়। সমাধান সংযুক্ত বৈশিষ্ট্য হয়। এগুলি নিয়ন্ত্রণ দ্বারা সংজ্ঞায়িত করা হয় যা নির্দিষ্ট প্রসঙ্গে অন্য নিয়ন্ত্রণ থেকে ডেটা প্রয়োজন। উদাহরণস্বরূপ একটি উপাদান যা প্যারেন্ট লেআউট প্যানেল দ্বারা প্রান্তিক হয়।
আমি মনে করি আপনি ক্লাসে সংযুক্ত সম্পত্তিটিকে সংজ্ঞায়িত করতে পারেন বা আপনি এটি অন্য শ্রেণিতে সংজ্ঞায়িত করতে পারেন। আমরা সবসময় স্ট্যান্ডার্ড মাইক্রোসফ্ট নিয়ন্ত্রণগুলি প্রসারিত করার জন্য সংযুক্ত সম্পত্তি ব্যবহার করতে পারি। কিন্তু নির্ভরতা সম্পত্তি, আপনি এটি আপনার নিজস্ব কাস্টম নিয়ন্ত্রণে সংজ্ঞায়িত করেন। উদাহরণস্বরূপ, আপনি একটি নিয়ন্ত্রণ নিয়ন্ত্রণ থেকে আপনার নিয়ন্ত্রণ উত্তরাধিকারী হতে পারেন, এবং আপনার নিজের নিয়ন্ত্রণে একটি নির্ভরতা সম্পত্তি সংজ্ঞায়িত এবং এটি ব্যবহার করতে পারেন। এটি কোনও সংযুক্ত সম্পত্তি সংজ্ঞায়নের সমতুল্য এবং মানক নিয়ন্ত্রণে এই সংযুক্ত সম্পত্তিটি ব্যবহার করুন।