WCF MVVM + Entity bindowanie danych w DataGrid

0

Tak jak w tytule mam projekt WPF używający wzorca MVVM (żadnego frameworka, własna prosta implementacja). Jako źródło danych używam entity framework. Na formtce dodaje kontrolkę DataGrid do której mam zamiar zbindować dane za pomocą linq to entities.

To mój kod xaml DataGrid'a:

 
            <DataGrid FontSize="12" Grid.Row="1" 
                      Grid.Column="0" 
                      HorizontalAlignment="Left" 
                      VerticalAlignment="Top" 
                      Width="340" Height="135" 
                      AutoGenerateColumns="False" 
                      Name="CompaniesGrid"
                      ItemsSource="{Binding CompaniesList}"
                      SelectedItem="{Binding Company}"
                      IsReadOnly="True"
                      >
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Nazwa" IsReadOnly="True" Width="120" Binding="{Binding X}"/> //PRZYKŁAD
                    <DataGridTextColumn Header="Skrót" IsReadOnly="True" Width="60" Binding="{Binding Y}"/> //PRZYKŁAD
                    <DataGridTextColumn Header="Ulica" IsReadOnly="True" Width="80" Binding="{Binding Z}"/> //PRZYKŁAD
                    <DataGridTextColumn Header="Miasto" IsReadOnly="True" Width="80" Binding="{Binding A}"/> //PRZYKŁAD
                </DataGrid.Columns>
            </DataGrid>

Pytanie dotyczy właściwości "Binding" w DataGridTextColumn czy do niej bindowane są poszczególne elementy kolekcji (listy) którą z kolei binduje do kontrolki (za pomocą: ItemsSource="{Binding CompaniesList}"), problem polega na tym że po odpaleniu aplikacji program nie zgłasza żadnych wyjątków pojawia się linia (w bazie mam tylko jeden rekord) ale wszytsko jest "puste", jak kliknę i sprawdzę SelectedItem="{Binding Company}" to co ustawia sie po kliknieciu na element to dane są ok (tzn MessageBoxem wyswietlam sobie np Name z Company), czyli obsługa SelectedItems działą natomiast wygląda na to że dane są pobierane ale nie mogę ich wyświetlić w kontrolce :/
Oto mój kod klasy ViewModel:

 
    public class CompaniesModelView : BindableBase
    {
        public BaseAppControlModelView AppControl { get; private set; }
        public CompaniesModelView()
        {
            AppControl = BaseAppControlModelView.Instance()
                .SetAligment(VerticalAlignment.Center, HorizontalAlignment.Center)
                .SetPageTo(PageUri.ADM_COMPANIES)
                .SetCurrentContent(Content.COMPANIES);

            context = new DBModelContext();
            companiesList = new ObservableCollection<Companies>(GetCompaniesList());
            SaveCommand = new DelegateCommand(SaveExecute, SaveCanExecute);
            AddCommand = new DelegateCommand(AddExecute, AddCanExecute);
            DeleteCommand = new DelegateCommand(DeleteExecute, DeleteCanExecute);
        }

        public ObservableCollection<Companies> CompaniesList
        {
            get { return companiesList; }
            set
            {
                if (companiesList != value)
                {
                    companiesList = value;
                    OnPropertyChanged();
                }
            }
        }
        public DelegateCommand SaveCommand { get; set; }
        public DelegateCommand AddCommand { get; set; }
        public DelegateCommand DeleteCommand { get; set; }

        public string CompanyFullName
        {
            get { return companyFullName; }
            set
            {
                if (companyFullName != value)
                {
                    companyFullName = value;
                    OnPropertyChanged();
                }
            }
        }
        public string CompanyShortName
        {
            get { return companyShortName; }
            set
            {
                if (companyShortName != value)
                {
                    companyShortName = value;
                    OnPropertyChanged();
                }
            }
        }
        public string AddressStreetName
        {
            get { return addressStreetName; }
            set
            {
                if (addressStreetName != value)
                {
                    addressStreetName = value;
                    OnPropertyChanged();
                }
            }
        }
        public string AddressStreetNumber
        {
            get { return addressStreetNumber; }
            set
            {
                if (addressStreetNumber != value)
                {
                    addressStreetNumber = value;
                    OnPropertyChanged();
                }
            }
        }
        public string AddressZipCode
        {
            get { return addressZipCode; }
            set
            {
                if (addressZipCode != value)
                {
                    addressZipCode = value;
                    OnPropertyChanged();
                }
            }
        }
        public string AddressCityName
        {
            get { return addressCityName; }
            set
            {
                if (addressCityName != value)
                {
                    addressCityName = value;
                    OnPropertyChanged();
                }
            }
        }
        public Companies Company
        {
            get { return companySelected; }
            set
            {
                if (companySelected != value)
                {
                    companySelected = value;
                    context.Entry(value).Reference(c => c.Addresses).Load();
                    CompanyFullName = value.Full_Name;
                    CompanyShortName = value.Short_Name;
                    AddressStreetName = value.Addresses.Street;
                    AddressStreetNumber = value.Addresses.Number;
                    AddressZipCode = value.Addresses.Zip_Code;
                    AddressCityName = value.Addresses.City;
                    OnPropertyChanged();
                }
            }
        }

        private DBModelContext context;
        private ObservableCollection<Companies> companiesList { get; set; }
        private List<Companies> GetCompaniesList()
        {
            var companiesQuery = from c in context.S_Companies
                                 select c;

            return companiesQuery.ToList();
        }

        private bool SaveCanExecute(object obj)
        {
            return false;
        }
        private bool AddCanExecute(object obj)
        {
            return false;
        }
        private bool DeleteCanExecute(object obj)
        {
            return false;
        }

        private void SaveExecute(object obj)
        {
            
        }
        private void AddExecute(object obj)
        {

        }
        private void DeleteExecute(object obj)
        {

        }

        private string companyFullName { get; set; }
        private string companyShortName { get; set; }
        private string addressStreetName { get; set; }
        private string addressStreetNumber { get; set; }
        private string addressZipCode { get; set; }
        private string addressCityName { get; set; }
        private Companies companySelected { get; set; }
    }
0

Zgaduje:

  1. Literówki na bindingach
  2. Źle podpięty datacontext
  3. Pola wysyłane do DataGrida nie są public

Łatwiej było by mieć cały projekt do wglądu. :P

0

Cały projekt to ok 5k linijek kodu, to co jest odpowiedzialne za ten element a konkretnie DataGrid i bindowanie przedstawione jest w przykładzie. Nie ma literówek bo output nic nie zgłasza, nie ma błędów wszystkie pola są punblic. Data coinext podpiety ok bo po kliknieciu wiersza w datagridzie (tak jak pisałem są wyświetlane wiesze ale wszytkie są "puste" tak jakby nie podpinał samych nazw - tesktu), po kliknieciu elementu binduje mi odpwowiedxnio wszytsko do pozostałych pól:

user image

0

W powyższym przykładzie widać doskonale że wczytał z bazy dwa wiersze (bo tyle ich jest w bazie) ale nie umie wyświetlić prawidłowo nazw.

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