DataGridCell का डेटा प्राप्त करने के लिए, आप इसे DataContext और Column
संपत्ति का उपयोग कर सकते हैं। यह कैसे करें यह वास्तव में निर्भर करता है कि आपका पंक्ति डेटा क्या है, यानी आप डेटाग्रिड के ItemsSource
संग्रह में क्या आइटम डालते हैं। अपने आइटम object[]
सरणियों मान लिया जाये कि कर रहे हैं:
// Assuming this is an array of objects, object[],this gets you the
// row data as you have them in the DataGrid's ItemsSource collection
var rowData = (object[]) DataGrid.SelectedCells[0].Item;
// This gets you the single cell object
var celldata = rowData[DataGrid.SelectedCells[0].Column.DisplayIndex];
अपने पंक्ति डेटा अधिक जटिल है, तो आप एक के अनुसार विधि है जो अपने पंक्ति डेटा आइटम पर विशिष्ट मूल्य के Column
संपत्ति और पंक्ति डेटा आइटम तब्दील लिखने के लिए की जरूरत है।
संपादित करें:
सेल आप अपने डेटा ड्रॉप में चयनित सेल नहीं है, एक ही विकल्प प्राप्त करना है तो DataGridRow
जो DataGridCell
अंतर्गत आता है, VisualTreeHelper
का उपयोग कर रहे हैं:
var parent = VisualTreeHelper.GetParent(gridCell);
while(parent != null && parent.GetType() != typeof(DataGridRow))
{
parent = VisualTreeHelper.GetParent(parent);
}
var dataRow = parent;
फिर आपके पास पंक्ति है और ऊपर के रूप में आगे बढ़ सकते हैं।
इसके अलावा, अपने प्रश्न है कि क्या आप विधि पर पुनर्विचार करना चाहिए के बारे में, मैं कस्टम WPF व्यवहार का उपयोग कर रों सुझाव है।
व्यवहारकर्ता सी # कोड से नियंत्रण की क्षमताओं को विस्तारित करने के लिए एक बहुत सीधी रास्ता प्रदान करते हैं, बल्कि एक्सएएमएल, फिर भी अपना कोड स्पष्ट और सरल रखते हैं (जो कि एमवीवीएम का पालन करने के बाद ही अच्छा नहीं है)। व्यवहार इस तरह से डिजाइन किए गए हैं कि वे पुन: प्रयोज्य हैं और आपके विशिष्ट नियंत्रण से बंधे नहीं हैं।
Here's a good introduction
अपने विशेष मामले के लिए, मैं सिर्फ तुम क्या करना है की एक विचार दे सकते हैं: अपने TextBlock नियंत्रण के लिए
लिखें एक DropBehavior
(या जो भी आप अपने को नियंत्रित DataGridCells, जो हैंडल अंदर चाहते हैं ड्रॉप। मूल विचार आपके नियंत्रण से OnAttached()
विधि में कोशिकाओं की evnt के कार्यों के अनुसार रजिस्टर करने के लिए है।
public class DropBehavior : Behavior<TextBlock>
{
protected override void OnAttached()
{
AssociatedObject.MouseUp += AssociatedObject_MouseUp;
}
private void AssociatedObject_MouseUp(object sender, MouseButtonEventArgs e)
{
// Handle what happens on mouse up
// Check requirements, has data been dragged, etc.
// Get underlying data, now simply as the DataContext of the AssociatedObject
var cellData = AssociatedObject.DataContext;
}
}
ध्यान दें कि, एकल कक्ष का डेटा इधर-उधर पार्स करने एम पंक्ति डेटा और Column
संपत्ति अप्रचलित हो जाती है।
तो फिर तुम TextBlocks, जो आप अपने कोशिकाओं के अंदर डाल करने के लिए इस व्यवहार देते हैं, अपने डेटा ग्रिड के CellStyle
की ContentTemplate
का उपयोग कर:
<DataGrid>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}">
<i:Interaction.Behaviors>
<yourns:DropBehavior/>
</i:Interaction.Behaviors>
</TextBlock>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
</DataGrid>
आप
सिस्टम में Behavior<T>
baseclass पा सकते हैं .Windows.Interactivity.dll
मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे उम्मीद है कि आपके लिए काम करता है और आपको विचार मिलता है ...
क्या आप ग्रिड की संरचना पेस्ट कर सकते हैं? – Freelancer
भौतिक ग्रिड व्यू या अंतर्निहित संरचना? – Miguel
बस कॉलम और एक्सपोल डेटा – Freelancer