WPF DataGrid

0

Stworzyłem dodatkowe okno WPF w moim projekcie, które zawiera ObservableCollection (Kolekcja) z obiektami (obiektKolekcji) mającymi zaimplementowany interfejs INotifyPropertyChanged.
Mam w tym oknie kontrolkę DataGrid, której źródłem jest Kolekcja. obiektyKolekcji posiadają 3 zmienne, które są odzwierciedlane w 3 kolumnach DataGrida.
W jednej z kolumn pozwoliłem na wpisywanie wartości bezpośrednio do kontrolki DataGrid. W momencie, kiedy użytkownik wpisze liczbę do kontrolki (zmiennej), wtedy automatycznie zmienia się wartość w kolejnej kolumnie (zaprogramowałem aby liczył w tym momencie to co wpisał użytkownik z inną wartością co daje razem sumę). W tym momencie potrzebuję przekazać do nowej klasy całą kolekcję aby ta wyliczyła sumę wszystkich obiektów (czyli sumę wszystkich wartości z jednej z kolumn) i potrzebuję czegoś w rodzaju eventu, który wywoła przekazanie do nowej klasy całej kolekcji. Wbudowane w DataGrid eventy niestety nie działają, ponieważ odnoszą się głównie do aktywnego "Cella" a nie do tego w kolejnej kolumnie(wtedy mógłbym odpalić event w momencie kiedy zmienia się suma, chodzi o to aby w czasie rzeczywistym było widać ogólną sumę w innej kontrolce np. TextBlocku). I tak np. event związany ze zmianą aktywnego pola działa świetnie (ponieważ po wpisaniu wartości i wciśnięciu Enter, aktywna komórka idzie w dół i podsumowanie pięknie działa) do momentu kiedy nie dochodzimy do ostatniego wiersza i po wciśnięciu Entera aktywna komórka nie zmienia już swojego położenia.
Dopiero w momencie zmiany aktywnej komórki podliczenie znowu zadziała a tak być nie może.
Chciałem podpiąć event pod jedną ze zmiennych obiektu, który wylicza sumę i to jest właśnie czas idealny ... obiekt pięknie woła (za sprawą INotifyPropertyChanged) że jest zmiana ale nie wiem jak przekazać to wyżej tzn. do instancji obiektu, który posiada kolekcję z tym obiektem aby ten mógł jakoś to wychwycić i wywołać procedurę odpowiedzialną za podsumowanie....
Eventy takie jak CellEditEnding nie działają właściwie, bo procedura wykona się jeszcze przed zmianą sumy.
Czy ktoś jest mnie w stanie jakoś naprowadzić na własciwy tor?
Z góry dziękuje ...

0

Czytałem to kilka razy i nie rozumiem za bardzo. Pokaż jakiś kod.

0

strasznie chaotycznie napisane i nie rozumiem całkiem o co chodzi ale po słowach kluczowych domyślam się że chodzi o takie rozwiązanie:
http://stackoverflow.com/a/3478581/2770274

lub o rzucenie eventu OnPropertyChanged wyżej czyli po prostu

encja.PropertyChanged += (s, e) => {
    if (string.IsNullOrEmpty(e.PropertyName) || e.PropertyName == "Costam") OnPropertyChanged("Suma");
};

(z dokumentacji wywołanie zdarzenia onpropertychanged z pustym lub równym null propertyname oznacza zmianę wszystkich propertów encji, stąd pierwszy warunek)

0

Mam klasę o nazwie Bon, która zawiera 3 zmienne

double wartosc;
double ilosc;
double suma;

Mam okno(klase) WPF z kontrolką DataGrid:

<datagrid x:name="BonyDataGrid" canuseraddrows="True" itemssource="{Binding}" width="300" height="150" autogeneratecolumns="False" selectionmode="Single" selectionunit="Cell" selectedcellschanged="BonyDataGrid_SelectedCellsChanged"> <datagrid.columns> <datagridtextcolumn minwidth="60" header="Bon" binding="{Binding Path=wartosc}" isreadonly="True" sortdirection="Descending" /> <datagridtextcolumn minwidth="60" header="Ilość" binding="{Binding Path=ilosc}" /> <datagridtextcolumn minwidth="60" header="Wartość" isreadonly="True" binding="{Binding Path=suma}" /> </datagrid.columns> </datagrid>

W tym oknie(klasie) mam ObservableCollection<Bon> Bony.

Do kontrolki za pomocą ItemsSource ładowana jest kolekcja Bony, zostają pobrane z pliku xml. Użytkownik ma możliwość ręcznego wpisywania wartości w kolumnie o nagłówku ilość. Po wpisaniu tam ilości automatycznie zostaje przypisana do obiektu nowa wartość zmiennej ilosc, w tym momencie nastepuje obliczenie ilosc * wartosc = suma, potrzebuję eventu, który aktualną kolekcję przekaże do metody, która oblicza sumy wszystkich obiektów z kolekcji i przekaże wynik do kontrolki TextBlock, który wyświetli podsumowanie.
Na razie korzystam z eventu BonyDataGrid_SelectedCellsChanged, ponieważ po wpisaniu ilości i zatwierdzeniu enterem aktywny "Cell" przechodzi poniżej i event przekazuje kolekcje do metody. Problem zaczyna się, kiedy w ostatnim polu wpisujemy ilość, wtedy aktywny "Cell" pozostaje w miejscu i event BonyDataGrid_SelectedCellsChanged nie ma miejsca, dopiero kiedy przesuniemy ręcznie kursor np, w górę to event się wykona.
Eventy takie jak CellEditEnding, nie działają poprawnie ponieważ wykonują się jeszcze przed obliczeniem sumy.
Jedynym miejscem, które byłoby idealne i potrafię je przechwycić to moment przypisywania w obiekcie typu Bon zmiennej suma, ale z tego miejsca nie mam pojęcia czy da się jakoś przekazać informacje do okna gdzie znajduje się kolekcja zawierająca ten obiekt.

0
akwamorela napisał(a):

strasznie chaotycznie napisane i nie rozumiem całkiem o co chodzi ale po słowach kluczowych domyślam się że chodzi o takie rozwiązanie:
http://stackoverflow.com/a/3478581/2770274

lub o rzucenie eventu OnPropertyChanged wyżej czyli po prostu

encja.PropertyChanged += (s, e) => {
    if (string.IsNullOrEmpty(e.PropertyName) || e.PropertyName == "Costam") OnPropertyChanged("Suma");
};

(z dokumentacji wywołanie zdarzenia onpropertychanged z pustym lub równym null propertyname oznacza zmianę wszystkich propertów encji, stąd pierwszy warunek)

Czyli w seterze obiektu w momencie obliczania sumy mam to wywołać i przechwyci to zaimplementowany w Okno interfejs INotifyPropertyChanged?
Póki co mogę przechwycić OnPropertyChanged wewnątrz obiektu z tej kolekcji, nie wiem jak to wykorzystać aby móc dokonywać zmian w obiekcie nadrzędnym, posiadającym okno ...
http://stackoverflow.com/a/3478581/2770274 za pomocą tego, cała kolekcja zawoła OnPropertyChanged jak zmianie ulegnie zawartość obiektu?

1 użytkowników online, w tym zalogowanych: 0, gości: 1