WPF - zobrazení dat ze dvou projených kolekcí   otázka

C#, WPF

Dobrý den,

chtěl bych ve WPF datagridu zobrazit data z kolekce knih kde by ve sloupci Žánr byl místo čísla idGendre textový popisek který je v druhé kolekci.


public class  Book: INotifyPropertyChanged
    {
        private string name;
        private int idGendre;
    }

public class  Gendre: INotifyPropertyChanged
    {
        private int idGendre;
        private string gendre;
    }


public class Data
    {
        private ObservableCollection<Book> _booksCollection;
        private ObservableCollection<Gendre> _gendresCollection;
    }




public partial class MainWindow : Window
    {
        Data data;      
        public MainWindow()
        {
            InitializeComponent();
            data= new data();
            DataContext = data;
        }
    }

<DataGrid ItemsSource="{Binding BooksCollection}" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridTextColumn Header="Jméno" Binding="{Binding Name}"/>
    <DataGridTextColumn Header="Žánr id" Binding="{Binding IdGendre}"/>    
    <DataGridTextColumn Header="Žánr popisek" Binding="{Binding IdGendre, Converter={StaticResource convertor}}"/>
  </DataGrid.Columns>
</DataGrid>

Zkoušel jsem použít konvertor ale umím ho nadefinovat jen takto staticky.


 public class Convertor : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            switch (value.ToString().ToLower())
            {
                case "1":
                    return "kronika";
                case "2":
                    return "komiks";
                case "3":
                    return "román";
            }
            return "";
        }
}

Poradíte prosím jak toto spojení kolekcí vyřešit.

Dík Tom

nahlásit spamnahlásit spam 0 odpovědětodpovědět

linq

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak si vytvořte jednu kolekci, do které dáte data z obou tabulek...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkoušel jsem takto spojit kolekce jenže vnikne anonymní typ složený ze dvou tříd a jedině tím IEnumerable<object> jsem ho nějak dokázal použít dál

public IEnumerable<Object> Joined
{
   get
   {
       return (from Book in _booksCollection
                        join Gendre in _gendresCollection
                        on _booksCollection.idGendre equals _gendresCollection.idGendre
                        select new { Book, Gendre }).ToList();
    }
}

ale pokud to někde použiju tak už nevím jak znova definovat typ

např:

foreach (IEnumerable<object> obj in data.Joined)
{
      obj.????????????????????,
}

Tak asi budu muset vytvořit novou třídu a ty mé dvě dát do ní tím pádem už to použít. Nebo dá se to vyřešit nějak lépe?

Dík za radu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak mě napadá taková prasárna:

public IEnumerable<dynamic> Joined
{
   get
   {
       return (from Book in _booksCollection
                        join Gendre in _gendresCollection
                        on _booksCollection.idGendre equals _gendresCollection.idGendre
                        select new { Book, Gendre }).ToList();
    }
}

foreach (IEnumerable<object> obj in data.Joined)
{
      Console.WriteLine("Book: {0}, Gendre:{1}" obj.Book, obj.Gendre);
}

R.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pardon, ten druhý blok následovně:

foreach (var obj in data.Joined)
{
      Console.WriteLine("Book: {0}, Gendre:{1}" obj.Book, obj.Gendre);
}
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nějak nevím s čím máte problém.

Pokud si data propojíte a vytvoříte anonymní typ, tak i ten lze dát jako datacontext tomu datagridu a vše funguje.

Jen je potřeba si definovat názvy vlastností u anonymního typu:

select new { BookName = b.Name, Gendre = g.Name };

V gridu pak:

<DataGridTextColumn Header="Jméno" Binding="{Binding BookName}"/>
...

Varianta s vlastní třídou je lepší. Tato nová třída je vlastně ViewModel.

U WPF Vás to stejně nemine (MVVM pattern).

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback