Mam datagrid, który jest powiązany z listą w modelu widoku. Zawartość siatki nie aktualizuje się, dopóki nie kliknę nagłówka wiersza. Kliknięcie w różne komórki nie ma na nie wpływu. Muszę kliknąć na nagłówek.Wiązanie Datagrid WPF nie jest aktualizowane, dopóki nie zostanie kliknięty nagłówek wiersza
To DataGrid w XAML:
<DataGrid x:Name="TransactionDetailsGrid" Grid.Row="1" AutoGenerateColumns="False" SelectionMode="Extended" IsReadOnly="True" HeadersVisibility="Column"
ItemsSource="{Binding TransactionDetailList}" SelectedItem="{Binding SelectedTransactionDetail}" GridLinesVisibility="None">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Account.AccountNumber}" Header="Account No." HeaderStyle="{StaticResource DataGridHeaderStyleCenter}" Width="120" />
<DataGridTextColumn Binding="{Binding Path=Account.AccountName}" Header="Account Name" HeaderStyle="{StaticResource DataGridHeaderStyleCenter}" Width="*" />
<DataGridTextColumn Binding="{Binding Path=Amount}" Header="Amount" HeaderStyle="{StaticResource DataGridHeaderStyleCenter}" Width="120" />
</DataGrid.Columns>
</DataGrid>
A to z modelu Widok:
public List<TransactionDetail> TransactionDetailList
{
get { return this._transactionDetailList; }
set
{
this._transactionDetailList = value;
RaisePropertyChanged("TransactionDetailList");
}
}
Jest to edycja jednej z pozycji, w modelu Widok:
private void AddTransactionDetail()
{
TransactionDetailViewModel viewModel = new TransactionDetailViewModel();
MainWindowViewModel.ViewLoader.ShowDialog(viewModel);
if (viewModel.TransactionDetail != null)
{
this.TransactionDetailList.Add(viewModel.TransactionDetail);
RaisePropertyChanged("TransactionDetailList");
}
}
Po tym uruchomieniu, mogę umieścić punkt przerwania na pobierającym TransactionDetailList, a kolekcja h jako przedmiot w nim. Jednak datagrid jest pusty. Jeśli kliknę wiersz nagłówka, element pojawi się w siatce.
Mam taki sam problem podczas edycji.
Zrobiłem to z powodzeniem wcześniej, więc nie jestem pewien, co tutaj jest inaczej. Czy brakuje mi czegoś oczywistego? Dlaczego siatka nie wyświetla jej zawartości, dopóki nie kliknę w wiersz nagłówka?
Właśnie zauważyłem coś interesującego. Kiedy klikam nagłówek siatki, punkt przerwania w pobierającym transakcję TransactionDetailList nie zostanie trafiony, ale dane nadal będą wyświetlane. Tak, to jest tak, jakby siatka zawierała informacje, po prostu nie jest wyświetlana, dopóki nagłówek nie zostanie kliknięty.
Po zmianie na ObserveableCollection zadziałało. Ale teraz mam ten sam problem z edycji (siatka nie aktualizuje aż klikając nagłówek):
private void EditTransactionDetail()
{
TransactionDetailViewModel viewModel = new TransactionDetailViewModel(this.SelectedTransactionDetail);
MainWindowViewModel.ViewLoader.ShowDialog(new TransactionDetailViewModel(this.SelectedTransactionDetail));
RaisePropertyChanged("TransactionDetailList");
}
Czy moja jednostka należy wdrożyć INotifyPropertyChanged? Jeśli zmienię kolekcję i zadzwonię do RaisePropertyChanged, czy to nie powinno spowodować aktualizacji siatki?
Kiedy zmieniam pozycję na liście, czy ta linia powinna spowodować aktualizację datagridu, pokazując w nim zaktualizowany element? RaisePropertyChanged ("TransactionDetailList"); –
@Bob: Nie. Twój seter działa tak, jak każdy inny ustawodawca nieruchomości w danym języku. Zostaje on wywołany tylko po zastąpieniu całej 'TransactionDetailList'. Nie jest to bardzo przydatne w przypadku interfejsu użytkownika, dlatego właśnie stworzyli 'INotifyCollectionChanged' i' ObservableCollection '. –
@ Bob: Oh, czekaj, masz na myśli ostatni w swoim pytaniu? Nie, nie powinieneś informować UI, że cała lista zmienia się, gdy zmieniasz tylko wartości jednej z właściwości jednego z elementów, które * dzieje się *, które mają być przechowywane na liście. To całkowicie zabije twój perf. Zamiast tego zaimplementuj 'INotifyPropertyChanged' na klasie' TransactionDetail'. –