एक कॉलम में बटन, जिस पंक्ति से यह क्लिक इवेंट हैंडलर पर आया था


98

मैंने अपने WPF डाटाग्रिड के आइटम्स को अपने DAL से लौटी वस्तुओं की सूची में सेट किया है। मैंने एक अतिरिक्त कॉलम भी जोड़ा है जिसमें एक बटन है, xaml नीचे है।

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

यह ठीक प्रदान करता है। हालाँकि Button_Click विधि पर, क्या कोई ऐसा तरीका है जिससे मैं डेटाग्रिड पर पंक्ति प्राप्त कर सकता हूँ जहाँ बटन रहता है? अधिक विशेष रूप से, मेरी वस्तुओं में से एक गुण "आईडी" है, और मैं इसे इवेंट हैंडलर में किसी अन्य रूप के निर्माता में पारित करने में सक्षम होना चाहता हूं।

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

शायद मुझे अपने xaml में कुछ अतिरिक्त चाहिए, या हो सकता है कि मैं इस बारे में चक्कर लगा रहा हूं? किसी भी मदद / सलाह की सराहना की।

जवाबों:


128

मूल रूप से आपका बटन एक पंक्ति डेटा ऑब्जेक्ट के डेटासोनेट को इनहेरिट करेगा। मैं इसे MyObject कह रहा हूं और उम्मीद करता हूं कि MyObject.ID वही है जो आप चाहते थे।

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
इस तरह के सामान को करने का आदर्श तरीका कमांड्स (मूल रूप से MVVM पैटर्न) का उपयोग करना है, आप अपने डेटा ऑब्जेक्ट (ViewModel) में एक कमांड बना सकते हैं और Button.Command कॉल कर सकते हैं, ताकि बटन क्लिक करने के पीछे कोई कोड न हो।
जोबी जॉय

1
@ जोबीजॉय: क्या आपके पास कमांड / रिलेकमांड का उपयोग करके इसका उदाहरण है? मैं कुछ चीजों की कोशिश कर रहा हूं, लेकिन इसे काम करने के लिए नहीं मिल सकता है ..
22

मेरे द्वारा देखे गए कमांड उदाहरणों के साथ समस्या यह है कि आपको अपने दृश्य मॉडल के एक सदस्य को डेटाग्रिड चयनित आइटम को डीटैबिट करना है और इस प्रकार एक डिलीट बटन के लिए अच्छा होने के लिए कमांड को पर्याप्त रूप से उत्पन्न करना मुश्किल है। मुझे एक डिलीट बटन टेम्प्लेट कॉलम संसाधन चाहिए, जिसका उपयोग मैं अपने ऐप में बहुत कुछ हटाने के लिए कर सकता हूं।
एरिक

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;
}

आप घटनाओं और आदेशों को क्यों मिला रहे हैं? कमांड का उपयोग करें और इसमें कमांड पैरामीटर का उपयोग करें।
6

1
3 जवाब: क्यों नहीं? सादगी। और ओपी ईवेंट हैंडलर के बारे में पूछ रहा है, आज्ञाओं के बारे में नहीं। एक आदेश overkill हो सकता है। उपयोग करना CommandParameterसंपत्ति का इच्छित उपयोग नहीं हो सकता है, लेकिन शब्दार्थ, यह Tagहैंडलर में बंधी हुई वस्तु से आईडी प्राप्त करने की तुलना में उपयोग करने और सरल से अधिक सार्थक है । यदि आप कमांड्स पसंद करते हैं, तो यह दृष्टिकोण ठीक है, लेकिन यदि आप इसका उपयोग नहीं करने जा रहे हैं तो जटिलता क्यों जोड़ें?
xr280xr

10

एक और तरीका है जो पैरामीटर पैरामीटर को जोड़ता है डेटाकोटेक्स्ट और एमवीवीएम का सम्मान करता है जैसे जोबी जॉय कहता है कि बटन को डेटासोनेट फॉर्म पंक्ति विरासत में मिली है।

XAML में बटन

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

कमान लागू करना

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

        }
    }

तो, RowActionCommand मॉडल में होगा या क्या आप ViewModel के बटन के डेटासोनेट को रीसेट करेंगे?
टॉम पाडिला

@ पेट्रिएस्टा "राउएशनकॉमन को प्रत्येक पंक्ति दृश्य मॉडल में परिभाषित किया गया है।" इसका कोई मतलब नहीं है। लेकिन वैसे भी, अच्छा समाधान।
इगोर


0

यदि आपका DataGrid का DataContext DataView ऑब्जेक्ट (DataTable का डिफ़ॉल्ट दृश्य गुण) है, तो आप यह भी कर सकते हैं:

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

यह होना चाहिए e.OriginalSource। के बजाय e.Source
Bigeyes

गंभीरता से Bigeyes, मेरा जवाब असली, लाइव, वर्किंग कोड से है!
सर्फिंगसंता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.