C# WPF XAML ongelma

Viestiketju alueella 'Ohjelmointi, pelikehitys ja muu sovelluskehitys' , aloittaja Supercluster, 05.03.2018.

  1. Supercluster

    Supercluster

    Viestejä:
    8
    Rekisteröitynyt:
    03.04.2017
    Nyt meni hermot. Löytyisiköhän täältä asiantuntijaa seuraavaan ongelmaan:

    Minulla on "Note" niminen luokka, joka sisältää id kentän sekä kustomoidun user control:in.

    Koodi:
    public class Note
    {
        public int id { get; set; }
        public MyUserControl myControl { get; set; }
    }
    
    Luon listan Note luokasta:

    Koodi:
    List<Note> notes = new List<Note>();
    
    ... listan käpistelyä ...

    Asetan listan DataGrid:n tietolähteeksi:

    Koodi:
    dataGrid.ItemsSource = notes;
    
    Olen XAML puolella luonut datagrid:iin seuraavat kentät, joissa "Note" -luokan jäsenet olisi määrä näkyä:

    Koodi:
    <DataGrid.Columns>
    
      <DataGridTextColumn Header="Id" Binding="{Binding id}"/>
    
        <DataGridTemplateColumn Header="My Control">
          <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
               ????????????????????????????
            </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
    
    </DataGrid.Columns>
    
    Eli ymmärtääkseni tuohon kysymysmerkkien tilalle pitäisi saada jotakin, millä "notes" -listassa olevan "myControl" -kontrollin saisi näkymään taulukossa. Yksinkertainen aloittelijan kysymys, johon en ole löytänyt hakemalla minkäänlaista vastausta.

    Kiitän jo etukäteen!
     
  2. weetm

    weetm

    Viestejä:
    16
    Rekisteröitynyt:
    17.10.2016
    Itse ratkaisisin tämän niin, että MyUserControl tulisi XAMLiin DataTemplaten sisään ja sitten tuolta datakontekstista (Note-olio) vain bindattaisiin haluttu data tuohon kyseisen UserControlliin. Eli että Note-luokassa ei enää olisi MyUserControllia vaan ainoastaan siihen liittyvä data. Ei ole MVVM-arkkitehtuurin mukaista tuoda UI-komponentteja ViewModelin puolelta vaan, enkä tiedä onko tämä edes XAMLin keinoin mahdollista

    Eli DataTemplatesta tulisi jokseenkin tällainen:
    Koodi:
    <DataTemplate>
        <MyUserControl Text="{Binding Text}" />
    </DataTemplate>
    Note-luokka puolestaan yksinkertaistuisi siten että se sisältäisikin tuon MyUserControllin sijaan Text-nimisen jäsenen, jossa olisi MyUserControllissa esitettävä data.
     
  3. Supercluster

    Supercluster

    Viestejä:
    8
    Rekisteröitynyt:
    03.04.2017
    Kiitos vastauksesta weetm,

    Hieman osasin epäilläkin, että jokin tämän tyyppinen homma olisi kysymyksessä. Tässä tulee eteen uusi ongelma tosin. Minulla on MyUserControl:ssa sisäänrakennettua toiminallisuutta (metodeja), joita täytyy suorittaa, ennen kuin kontrolli on valmis näytettäväksi UI:n puolella. Täten jos luon uuden/tyhjän instanssin DataTemplaten sisään ja tuon siihen pelkän datan, niin kuinka tässä tapauksessa voisin suorittaa kyseiset metodit (esim. myUserControl.CalculateValues(), joka vaihtaa taustan väriä riippuen syötetystä datasta)?

    Jos käyttäisin ItemsControl objektia DataTemplaten sisällä ja bindaisin siihen listan MyUserControl olioista, niin tällöin UserControllien tuominen onnistuisi kuten alkuperäisessä postauksessa halusin. Mutta tässä tapauksessa en halua bindata listaa olioista vaan yksittäisen MyUserControl olion. Toivottavasti osasin selittää jotakuinkin järkevästi.
     
  4. weetm

    weetm

    Viestejä:
    16
    Rekisteröitynyt:
    17.10.2016
    Vaikka ItemsSourcen kautta tulisi pelkkä data (kuten homma lähtökohtaisesti pitäisi tehdä), MyUserControllilla voi edelleen olla sisäänrakennettua toiminnallisuutta, jota voidaan suorittaa ennen UserControllin näyttämistä. MyUserControllejahan piirretään jokaista ItemsSourcen itemiä kohden, eli jos vaikkapa MyUserControllin Loaded-tapahtuman käsittelijässä suorittaa tuon esimerkkinä antamasi CalculateValues-funktion, tulee se suoritettua ennen kontrollin piirtämistä. Tein pienen esimerkkiprojektin, joka ehkä selventää tätä kokonaisuutta. Siinä on esimerkkiä MyUserControllin DataContextin asettamisesta sekä myös tuosta MyUserControllin sisäisen toiminnallisuuden suorittamisesta. Voit ladata esimerkkiprojektin täältä: https://drive.google.com/open?id=1krQZ1eb1KHKh_Gq5zFSmx5TxH3FSTRM2
     
    Supercluster tykkää tästä.
  5. Supercluster

    Supercluster

    Viestejä:
    8
    Rekisteröitynyt:
    03.04.2017
    Kiitos paljon neuvoista ja malliprojektista! Eiköhän tämä ala tästä nyt selventymään.