Aktualizacja wyświetlanych danych w DataGrid - MVVM

0

Cześć,
Mam problem z aktualizacją datagrida (WPF) we wzorcu MVVM, używam ObservableCollection i działa wypełnienie i oczywiście dane widać natomiast jest problem z wyświetleniem nowych wartości. Macie może jakieś pomysły? Przeszukałem overstackflow i nie znalazłem satysfakcjonującej odpowiedzi tym bardziej, że czyszczenie ObservableCollection powoduje zmianę datagrida na pusty, a już przypisanie MainDataGrid = newQuery2 nie...
View xaml:

<DataGrid Grid.Row="1" IsReadOnly="True"  MinHeight="329" MinWidth="872" Grid.RowSpan="1" AutoGenerateColumns="False" CanUserResizeColumns="True" AlternatingRowBackground="Gainsboro"  AlternationCount="2" ItemsSource="{Binding MainDataGrid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SelectedContractor}" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Kontrahent" MinWidth="200" Binding="{Binding ContractorName, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Numer tel." MinWidth="100" Binding="{Binding NumberPhone, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Email" MinWidth="150" Binding="{Binding Email, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Osoba do kontaktu" Width="*" Binding="{Binding MainPerson, Mode=TwoWay}"/>
            </DataGrid.Columns>
            <DataGrid.InputBindings>
                <MouseBinding Gesture="LeftDoubleClick" Command="{Binding OpenSelectedContractorCmd}" />
            </DataGrid.InputBindings>
        </DataGrid>

ViewModel (wlaściwości) C#:

ObservableCollection<DataMainContractor> _MainDataGrid;
        public ObservableCollection<DataMainContractor> MainDataGrid
        {
            get
            {
                return _MainDataGrid;
            }
            set
            {
                _MainDataGrid = value;
                OnPropertyChanged("_MainDataGrid");
            }
        }

Wpisanie do DataGrida (działa):

private void ShowData()
        {
            var query = gmdc.getContractorName();
            ObservableCollection<DataMainContractor> newQuery = new ObservableCollection<DataMainContractor>(query);
            MainDataGrid = newQuery;
        }

ViewModel Aktualizacja/podanie nowych danych do datagrida (niedziała):

private void Search()
        {
            var query = gmdc.getMainDataSearchPhone(ContractorNumberPhone);
            ObservableCollection<DataMainContractor> newQuery2 = new ObservableCollection<DataMainContractor>(query);
            MessageBox.Show(ContractorNumberPhone);
            //MainDataGrid.Clear(); //.Clear działa bo czyści ObservableCollection i jest pusty datagrid
            MainDataGrid = newQuery2; // to już nie działa
        }

Z góry dziękuję za odpowiedzi

1

OnPropertyChanged("_MainDataGrid"); a ten podkreślnik to po co tam ;P? Nazwy propertisa użyj a nie pola

0

No nieeee...robiłem bez podkreślnika i mi nie szło i pewnie zmieniłem i nie zauważyłem... W takim razie przepraszam za głupie pytanie i dziękuję za rzuceniem świeżym okiem ;)

0

OnPropertyChanged(nameof(this.MainDataGrid));

Później się dziwisz, że masz problemy takie jak tutaj z magic stringami,

1

Bardzo fajnym sposobem na implementacje Interfejsu INotifyPropertyChanged jest wykorzystanie biblioteki System.Runtime.CompilerServices i atrybutu [CallerMemberName]:

public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName] string propertyName = "") {
      if (PropertyChanged != null) {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
    }

wtedy properties będzie wyglądał tak:

private Group _selectedGroup;
    public Group SelectedGroup {
      get { return _selectedGroup; }
      set {
        if (_selectedGroup == value) return;
        _selectedGroup = value;
        OnPropertyChanged();
      }
    }

Wtedy nazwa atrybutu zostaje pobierana podczas wywoływania metody OnPropertyChanged().
Jeżeli dodamy do tego określenie ViewModel przekazywanego do View, w atrybucie głównym:

<UserControl x:Class="Wordki.Views.BuilderPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:helpers="clr-namespace:Wordki.Helpers"
             xmlns:viewModels="clr-namespace:Wordki.ViewModels"
             xmlns:models="clr-namespace:Wordki.Models"
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
             xmlns:command="http://www.galasoft.ch/mvvmlight"
             xmlns:valueDescription="clr-namespace:Controls.ValueDescription;assembly=Controls"
             mc:Ignorable="d" 
             d:DesignHeight="900" d:DesignWidth="1200"
             d:DataContext="{d:DesignInstance {x:Type viewModels:BuilderViewModel}}" <---------------------------
             Style="{DynamicResource AppPageStyle}"
             KeyboardNavigation.IsTabStop="False">
  <UserControl.Resources>
....

pomyłki możemy zminimalizować do 0;)

0

@vesper0990: bardzo fajnie tylko, że jak masz .net'a w wersji mniejszej niż 4.5 to ten sposób na nic się nie przyda. :)

0

O bardzo dziękuję za rady. Z pewnością wykorzystam ;) akurat wersja .net'a mnie nie ogranicza więc nie ma problemu, robię program w celu naukowym tj ogarniam MVVM, także czasem błędy się zdarzają i to takie jak widać banalne. Dziękuję jeszcze raz za odpowiedzi i pozdrawiam :)

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