Dlaczego własność nie jest aktualizowana po wykonaniu ICommand?

0

Mam kolejny problem z aplikacją WPF. Nie pisałem za wiele w WPF MVVM, więc wybaczcie moją wzmożoną aktywność :)

W modelu widoku mam zaimplementowany interfejs INotifyPropertyChanged:

public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(params string[] props)
        {
            if (PropertyChanged != null)
            {
                foreach (string prop in props)
                    PropertyChanged(this, new PropertyChangedEventArgs(prop));
            }
        }

W modelu widoku jest też instancja kolekcji obiektów, które są w nim dodane:

public static ObservableCollection<Booking> BookingList { get; set; } = new ObservableCollection<Booking>();

Przycisk widoku wywołuje komendę ReturnBooking:

<Button Grid.Row="1"
				Grid.Column="9"
				Style="{StaticResource buttonStyle}"
                Command="{Binding Path=ReturnBooking}"
                CommandParameter="{Binding ElementName=lbBookingList, Path=SelectedIndex}"
                ToolTip="Marks selected booking as returned" Margin="4.667,20,5.333,10">
            <TextBlock Text="Return selected booking" TextWrapping="Wrap" TextAlignment="Center"/>
        </Button>

Komenda wygląda następująco:

private ICommand returnBooking;
        public ICommand ReturnBooking
        {
            get
            {
                if (returnBooking == null)
                    returnBooking = new RelayCommand(
                    o =>
                    {
                        int bookingIndex = (int)o;
                        Booking booking = BookingList[bookingIndex];
                        if (booking.ReturnDate == null)
                        {
                            booking.ReturnDate = DateTime.Now;
                            repository.ReturnBooking(booking);
                            OnPropertyChanged("ReturnDate");
                            dialogBox.ShowDialog("Return updated", "Message");
                        }
                        else
                        {
                            dialogBox.ShowDialog("This book is already returned", "Message");
                        }
                    },
                    o =>
                    {
                        if (o == null) return false;
                        int bookingIndex = (int)o;
                        return bookingIndex >= 0;
                    });
                return returnBooking;
            }
        }

Komenda się odnosi do właściwości ReturnDate w modelu widoku:

public DateTime? ReturnDate
        {
            get
            {
                return model.ReturnDate;
            }
            set
            {
                model.ReturnDate = value;
                OnPropertyChanged("ReturnDate");
            }
        }

W modelu widoku znajduje się też instancja modelu:

private Booking model = new Booking();

A sam model wygląda następująco:

public class Booking
    {
        public int Id { get; set; }
        public string Comments { get; set; }
        public DateTime BorrowDate { get; set; }
        public DateTime? ReturnDate { get; set; }
        [ForeignKey("Reader")]
        public int Reader_Id { get; set; }
        public Reader Reader { get; set; }
        [ForeignKey("Book")]
        public int Book_Id { get; set; }
        public Book Book { get; set; }
    }

Nie rozumiem dlaczego po wywołaniu ICommand przez widok, w szczególności po przypisaniu ReturnDate = DateTime.Now; widok nie aktualizuje automatycznie daty? Jedynie następuje aktualizacja w DB. Czy to ma związek z faktem, że pracujemy na własności obiektu w ObservableCOllection? Czy w niewłaściwy sposób używam OnPropertyChanged("ReturnDate");?

1

Twoja klasa Booking też musi implementować INotifyPropertyChanged.
W tym momencie nikt nie wie, czy zmieniło się ReturnDate, czy nie. ObservableCollection daje Ci tylko tyle, że daje znać, gdy zmienią się elementy w kolekcji. Tzn., jeśli element zostanie dodany lub usunięty. Nie da Ci znać, jeśli element zostanie zmodyfikowany. Dlatego też Booking musi implementować INotifyPropertyChanged.

0

Przy okazji możesz też pokazać jak wygląda u Ciebie bindowanie w widoku, może tam też masz błąd.

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