ডাব্লুপিএফ একটি পদ্ধতি আবদ্ধ?


90

আপনি ডাব্লুপিএফ-এ এই দৃশ্যে কোনও অবজেক্ট পদ্ধতির সাথে কীভাবে আবদ্ধ হন?

public class RootObject
{
    public string Name { get; }

    public ObservableCollection<ChildObject> GetChildren() {...}
}

public class ChildObject
{
    public string Name { get; }
}

এক্সএএমএল:

<TreeView ItemsSource="some list of RootObjects">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type data:RootObject}" 
                                  ItemsSource="???">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type data:ChildObject}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

এখানে আমি GetChildrenপ্রতিটি RootObjectগাছের পদ্ধতিতে বাঁধতে চাই ।

সম্পাদনা বাঁধাই ObjectDataProviderকোনও কাজ করে বলে মনে হচ্ছে না কারণ আমি আইটেমের তালিকার সাথে আবদ্ধ, এবং ObjectDataProviderপ্রয়োজনগুলি একটি স্থিতিশীল পদ্ধতি, বা এটি নিজস্ব ঘটনা তৈরি করে এবং এটি ব্যবহার করে।

উদাহরণস্বরূপ, ম্যাট এর উত্তর ব্যবহার করে আমি পেয়েছি:

System.Windows.Data ত্রুটি: 33: অবজেক্টডেটাপ্রোভাডার বস্তু তৈরি করতে পারে না; প্রকার = 'রুটবজেক্ট'; ত্রুটি = 'কনস্ট্রাক্টরের জন্য ভুল পরামিতি' '

System.Windows.Data ত্রুটি: 34: অবজেক্টডাটাপ্রোভাইডার: টাইপ পদ্ধতিতে অনুরোধ করতে ব্যর্থ হয়েছে; পদ্ধতি = 'গেটচিল্ডেন'; প্রকার = 'রুটবজেক্ট'; ত্রুটি = 'নির্দিষ্ট সদস্যকে লক্ষ্য করে ডাকা যাবে না।' টার্গেটএক্সেপশন: 'সিস্টেম.প্রকাশন। টার্গেট এক্সেপশন: অ স্থিত পদ্ধতিতে একটি লক্ষ্য প্রয়োজন।


হ্যাঁ তুমি সঠিক. অবজেক্টডেটাপ্রভাইডারের একটি অবজেক্টআইনস্ট্যান্স সম্পত্তি রয়েছে (নির্দিষ্ট পদ্ধতিতে এর পদ্ধতিটি কল করার জন্য) তবে আমি মনে করি না এটি নির্ভরতা সম্পত্তি, সুতরাং আপনি এটি আবদ্ধ করতে পারবেন না (এএফআইকে)।
ম্যাট হ্যামিল্টন

4
হ্যাঁ আমি অবজেক্টআইনস্ট্যান্সের সাথে আবদ্ধ হওয়ার চেষ্টা করেছি এবং জানতে পেরেছি যে এটি নির্ভরতার সম্পত্তি নয়।
ক্যামেরন ম্যাকফারল্যান্ড

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

আপনার কি আসলে অবজেক্টইনস্ট্যান্সের সাথে আবদ্ধ হওয়া দরকার? (এটি পরিবর্তন হবে) ধরে নিচ্ছি যাতে আপনি পরিবর্তে নিজের পরিবর্তন-ইভেন্ট হ্যান্ডলিং তৈরি করতে পারেন এবং কোডে অবজেক্টডাটাপ্রোভাডারটি আপডেট করতে পারেন ...
টিম

4
সত্যের এক বছর পরে কিছু উত্স কোড দিয়ে আমার উত্তরটি আপডেট করেছে।
ড্র নোকস

উত্তর:


71

আপনার পক্ষে কার্যকর হতে পারে এমন আরেকটি পদ্ধতি হ'ল একটি কাস্টম তৈরি করা IValueConverterযা কোনও পদ্ধতির নামকে প্যারামিটার হিসাবে গ্রহণ করে, যাতে এটি এর মতো ব্যবহৃত হয়:

ItemsSource="{Binding 
    Converter={StaticResource MethodToValueConverter},
    ConverterParameter='GetChildren'}"

এই রূপান্তরকারী প্রতিবিম্বটি ব্যবহার করে পদ্ধতিটি আবিষ্কার ও প্রার্থনা করবে। এর জন্য কোনও যুক্তি না থাকার পদ্ধতিটি প্রয়োজন।

এই জাতীয় রূপান্তরকারী উত্স একটি উদাহরণ:

public sealed class MethodToValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var methodName = parameter as string;
        if (value==null || methodName==null)
            return value;
        var methodInfo = value.GetType().GetMethod(methodName, new Type[0]);
        if (methodInfo==null)
            return value;
        return methodInfo.Invoke(value, new object[0]);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException("MethodToValueConverter can only be used for one way conversion.");
    }
}

এবং একই ইউনিট পরীক্ষা:

[Test]
public void Convert()
{
    var converter = new MethodToValueConverter();
    Assert.AreEqual("1234", converter.Convert(1234, typeof(string), "ToString", null));
    Assert.AreEqual("ABCD", converter.Convert(" ABCD ", typeof(string), "Trim", null));

    Assert.IsNull(converter.Convert(null, typeof(string), "ToString", null));

    Assert.AreEqual("Pineapple", converter.Convert("Pineapple", typeof(string), "InvalidMethodName", null));
}

নোট করুন যে এই রূপান্তরকারীটি targetTypeপরামিতি প্রয়োগ করে না ।


6
হুঁ, ... হ্যাকের মতো মনে হচ্ছে তবে আমি মনে করি এটিই একমাত্র উপায় হতে পারে। এটা নিশ্চিত যে সবচেয়ে সহজ হবে!
এইটিইউন iteক্যবদ্ধ

25

এটি আপনার দৃশ্যে কতটা ভাল কাজ করবে তা নিশ্চিত নয় তবে আপনি MethodNameসম্পত্তিটি ব্যবহার করে এটির ডেটা পুনরুদ্ধার ObjectDataProviderকরতে একটি নির্দিষ্ট পদ্ধতিতে (আপনার MethodParametersসম্পত্তির নির্দিষ্ট পরামিতিগুলির সাথে ) কল করতে পারেন ।

এমএসডিএন পৃষ্ঠা থেকে সরাসরি নেওয়া একটি স্নিপেট এখানে:

<Window.Resources>
    <ObjectDataProvider ObjectType="{x:Type local:TemperatureScale}"
        MethodName="ConvertTemp" x:Key="convertTemp">
        <ObjectDataProvider.MethodParameters>
            <system:Double>0</system:Double>
            <local:TempType>Celsius</local:TempType>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>

সুতরাং এটি এমন ObjectDataProviderযে ConvertTempএকটি TemperatureScaleক্লাসের উদাহরণে একটি পদ্ধতি কল করে দুটি পরামিতি ( 0এবং TempType.Celsius) পেরিয়ে গেছে ।


11

আপনার কি পদ্ধতিতে বাঁধতে হবে?

যে সম্পত্তিটি পাওয়া যায় সেই পদ্ধতিটি আপনি কি কোনও সম্পত্তির সাথে আবদ্ধ থাকতে পারেন?

public ObservableCollection<ChildObject> Children
{
   get
   {
      return GetChildren();
   }
}

4
আমি ক্যামেরনের মন্তব্যটি বোঝাতে চাইছি যে তিনি কোনও ধরণের সাথে আবদ্ধ হন যাতে তিনি কোনও সম্পত্তি যুক্ত করতে পারেন না।
ড্রয় নোকস

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

@markmnl তাহলে সরাসরি কাজ করতে বাধ্য করার মূল বিষয়টি কী? তাহলে ওপির প্রশ্নটি আপনার মামলার কোন মানে করে না?
তেওমন শিপাহি

4

আপনি যদি পদ্ধতিতে কল করতে কোনও সম্পত্তি যুক্ত করতে না পারেন (বা এমন একটি র‍্যাপার ক্লাস তৈরি করুন যা সেই সম্পত্তি যুক্ত করে) তবে আমি যে পরিমাণটি জানি তার মধ্যে একটি ভ্যালুওকভার্টার ব্যবহার করা।


3

অবজেক্টডেটাপ্রভাইডারের একটি অবজেক্টইনস্ট্যান্স সম্পত্তিও রয়েছে যা অবজেক্টটাইপের পরিবর্তে ব্যবহার করা যেতে পারে


3

আপনি System.ComponentModelকোনও ধরণের জন্য গতিশীলভাবে বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে ব্যবহার করতে পারেন (তারা সংকলিত মেটাডেটার অংশ নয়)। আমি ডাব্লুপিএফ-এ এই পদ্ধতির ব্যবহার এমন ধরণের বাইন্ডিং সক্ষম করার জন্য করেছি যা ক্ষেত্রগুলিতে তার মানগুলি সংরক্ষণ করে, কারণ ক্ষেত্রগুলিতে বাঁধাই সম্ভব নয়।

ICustomTypeDescriptorএবং TypeDescriptionProviderযে ধরনের অর্জন করা কি আপনি চান পারবে। এই নিবন্ধ অনুযায়ী :

TypeDescriptionProviderআপনাকে প্রয়োগ করে এমন একটি পৃথক শ্রেণি লিখতে ICustomTypeDescriptorএবং তারপরে এই শ্রেণিকে অন্যান্য ধরণের বিবরণ সরবরাহকারী হিসাবে নিবন্ধিত করতে দেয়।

আমি নিজেই এই পদ্ধতির চেষ্টা করিনি, তবে আমি আশা করি এটি আপনার ক্ষেত্রে সহায়ক।


0

আপনার ডাব্লুপিএফ দৃশ্যে কোনও অবজেক্টের পদ্ধতির সাথে আবদ্ধ হওয়ার জন্য, আপনি এমন কোনও সম্পত্তির সাথে আবদ্ধ হতে পারেন যা কোনও প্রতিনিধিকে ফিরিয়ে দেয়।

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