Aby uzyskać dane o DataGridCell, można użyć to DataContext i właściwość Column
. Sposób, w jaki to zrobić, zależy dokładnie od tego, jakie są dane wiersza, tj. Jakie elementy umieszczasz w kolekcji DataGrid ItemsSource
. Zakładając, że przedmioty są object[]
tablice:
// 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];
Jeśli dane wiersz jest bardziej złożona, trzeba napisać według metody, która przekłada właściwość Column
i element danych rząd do określonej wartości na pozycji danych rzędu.
EDIT:
Jeśli komórka upuścić dane do nie jest wybrana komórka, jedną z opcji jest uzyskanie DataGridRow
do którego DataGridCell
należy, używając VisualTreeHelper
:
var parent = VisualTreeHelper.GetParent(gridCell);
while(parent != null && parent.GetType() != typeof(DataGridRow))
{
parent = VisualTreeHelper.GetParent(parent);
}
var dataRow = parent;
Następnie masz rząd i możesz postępować jak powyżej.
Ponadto chodzi o Twoje pytanie, czy należy ponownie rozważyć sposób, proponuję przy użyciu niestandardowych WPF zachowanie ruchowe s.
Zachowania zapewniają bardzo prosty sposób rozszerzania możliwości sterowania za pomocą kodu C#, a nie XAML, zachowując przy tym prostotę i prostotę kodu (co jest nie tylko przyjemne, jeśli podążacie za MVVM). Zachowania są zaprojektowane w taki sposób, aby można je było ponownie wykorzystać i nie były związane z konkretną kontrolą.
Here's a good introduction
Dla szczególnego przypadku, mogę tylko dać wyobrażenie o tym, co należy zrobić:
napisać DropBehavior
dla kontroli TextBlock (lub cokolwiek kontrolować chcesz wewnątrz firmy DataGridCells, który obsługuje spadek. podstawowym założeniem jest, aby zarejestrować według działań do EVNT komórek w sposobie kontrolą OnAttached()
.
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;
}
}
zauważyć, że podczas analizowania danych z pojedynczej komórki fro m dane wiersza i właściwość Column
stają się nieaktualne.
Następnie należy podłączyć ten problem do TextBlocks, które można umieścić wewnątrz komórek, stosując ContentTemplate
z CellStyle
swojej DataGrid:
<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>
można znaleźć Behavior<T>
klasy bazowej w
Systemu .Windows.Interactivity.dll
Nie testowałem tego, ale mam nadzieję, że działa dla ciebie i masz pomysł ...
czy możesz wkleić strukturę siatki? – Freelancer
Fizyczny widok GridView lub jego struktura? – Miguel
tylko kolumny i dane z zera – Freelancer