একটি কলামে বোতাম, সারিটি পাওয়া যা থেকে এটি ক্লিক ইভেন্ট হ্যান্ডলারটিতে এসেছে


98

আমি আমার ডাব্লুপিএফ ডেটাগ্রিডের আইটেমসোর্সটি আমার ডাল থেকে ফিরে আসা সামগ্রীর তালিকায় সেট করেছি set আমি একটি অতিরিক্ত কলামও যুক্ত করেছি যাতে একটি বোতাম রয়েছে, xaml নীচে রয়েছে।

<toolkit:DataGridTemplateColumn  MinWidth="100" Header="View">
    <toolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Click="Button_Click">View Details</Button>
        </DataTemplate>
    </toolkit:DataGridTemplateColumn.CellTemplate>
</toolkit:DataGridTemplateColumn>

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

private void Button_Click(object sender, RoutedEventArgs e)
    {
        //I need to know which row this button is on so I can retrieve the "id"  
    }

সম্ভবত আমার এক্সএএমএল-তে আমার অতিরিক্ত কিছু দরকার হয়, বা আমি হয়তো চারিদিকে ঘুরতে যাচ্ছি? কোন সহায়তা / পরামর্শ প্রশংসা।

উত্তর:


128

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

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyObject obj = ((FrameworkElement)sender).DataContext as MyObject;
    //Do whatever you wanted to do with MyObject.ID
}

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

4
@ জোবিজয়: কমান্ড / রিলেক্যামন্ড ব্যবহার করে আপনার কি এর উদাহরণ রয়েছে? আমি কয়েকটি জিনিস চেষ্টা করছি কিন্তু এটি কাজ করতে পারছি না ..
ভুডোচিল্ড

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

47

আমি এটি করতে চাইলে অন্য উপায়টি হ'ল আইডিটি বোতামের কমান্ডপ্যারামিটারের সম্পত্তিটিতে আবদ্ধ করা:

<Button Click="Button_Click" CommandParameter="{Binding Path=ID}">View Details</Button>

তারপরে আপনি কোডে এটির মতো অ্যাক্সেস করতে পারেন:

private void Button_Click(object sender, RoutedEventArgs e)
{
    object ID = ((Button)sender).CommandParameter;
}

আপনি ইভেন্ট এবং আদেশগুলি মেশাচ্ছেন কেন? কমান্ড ব্যবহার করুন এবং এতে কমান্ড প্যারামিটার ব্যবহার করুন।
অধ্যাপক

4
3 উত্তর: কেন নয়? সরলতা। এবং ওপি ইভেন্ট হ্যান্ডলার সম্পর্কে জিজ্ঞাসা করছে, আদেশ নয়। একটি কমান্ড ওভারকিল হতে পারে। ব্যবহার CommandParameterকরা সম্পত্তিটির উদ্দেশ্যযুক্ত ব্যবহার নাও হতে পারে তবে শব্দার্থকভাবে, এটি Tagহ্যান্ডলারের সীমানা থেকে আইডিটি পুনরুদ্ধার করার চেয়ে ব্যবহার করার চেয়ে বেশি অর্থবহ এবং সহজ। আপনি যদি কমান্ডগুলি পছন্দ করেন, তবে সেই পদ্ধতিটি ভাল, তবে আপনি যদি এটি ব্যবহার না করে থাকেন তবে কেন জটিলতা যুক্ত করবেন?
xr280xr

11

আরেকটি উপায়ে যা প্যারামিটার ডেটা কনটেক্সটকে নির্দেশ করে এবং এমবিভিএমকে শ্রদ্ধার সাথে আবদ্ধ করে জোবি জয় বলেছেন বোতামটি ডেটাঅন্টেক্সট ফর্ম সারি উত্তরাধিকার সূত্রে প্রাপ্ত।

এক্সএএমএল-তে বোতাম

<RadButton Content="..." Command="{Binding RowActionCommand}" 
                         CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=DataContext}"/>

কমান্ড বাস্তবায়ন

public void Execute(object parameter)
    {
        if (parameter is MyObject)
        {

        }
    }

সুতরাং, রো-অ্যাকশনকমন্ডলটি কি মডেলটিতে থাকবে বা আপনি ভিউমোডেলটিতে বোতামটির ডেটা কনটেক্সটটি পুনরায় সেট করবেন?
টম প্যাডিলা

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


0

যদি আপনার ডেটাগ্রিডের ডেটা কনটেক্সট কোনও ডেটাভিউ অবজেক্ট (কোনও ডেটাবেলের ডিফল্টভিউ সম্পত্তি) হয় তবে আপনি এটিও করতে পারেন:

private void Button_Click(object sender, RoutedEventArgs e) {
   DataRowView row = (DataRowView)((Button)e.Source).DataContext;
}

এটা হওয়া উচিত e.OriginalSource। পরিবর্তে e.Source
বিগাইজেস

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