2012-06-01 2 views
8

ho alcune funzionalità utente admin in WPF app che sto attualmente scrivendo e vorrei renderlo un po 'più intuitiva per l'utente finaleMigliorare la visualizzazione di una determinata colonna in una visualizzazione a griglia WPF

I 'Mi piacerebbe essere in grado di fornire un qualche tipo di mezzo per modificare facilmente l'elenco dei ruoli a cui un determinato utente appartiene. Al momento la griglia viene riempita come conseguenza del legame a un List<ApplicationUser>

ApplicationUser è mia classe definita come:

public class ApplicationUser 
{ 
     public Guid? UserId { get; set; } 
     public string GivenName { get; set; } 
     public string Surname { get; set; } 
     public string EmailAddress { get; set; } 
     public string UserPhone { get; set; } 
     public string NtLoginName { get; set; } 
     public List<Role> ApplicationRoles { get; set; } 
} 

Come si può vedere i ruoli che l'utente è in sono tenuti in un List<Role> . Role è la mia classe definita come:

public class Role 
{ 
    public Guid RoleId; 
    public string RoleName; 
    public string RoleDescription; 
} 

Il mockup qui sotto rappresenta lo stato attuale in cui ottengo solo i ruoli come una lista e attraverso l'uso di un convertitore solo visualizzare i ruoli come nuova linea separata stringhe nel gridView

Current state of gridview

Tuttavia questo è quello che mi piacerebbe realizzare per rendere commutando fuori e concernente l'adesione dei vari gruppi più facile.

Desired state of gridview

Ora che ci penso io probabilmente devo cambiare la definizione del ruolo di includere una proprietà IsMember per facilitare vincolante per la casella di controllo, ma se qualcuno ha un modo migliore sarò il benvenuto che, come bene. Posso cambiare il tipo JOIN nello sproc in modo da recuperare tutti i ruoli con una query su un particolare utente e riempire di conseguenza la proprietà IsMember.

Grazie per il vostro tempo!

+0

fatto questo mai vengono risolti? Dalla risposta in basso sento che non era così e potrei essere in grado di aiutarti se hai ancora bisogno di questo. – Maverik

+0

@Maverik - non è mai stato risolto. Lo stavo rivisitando oggi dopo una prolungata deviazione in altre aree dell'app. Stavo guardando la risposta proposta da Tamir Dresher, ma lavorerò con te se puoi ... – noonand

+0

Beh, la sua idea è giusta ma, a giudicare dai dati forniti, non sembra così semplice, come potrebbe apparire dalla sua risposta. La lista dei ruoli totali è statica o cambia nel tempo con nuovi ruoli aggiunti o vecchi completamente rimossi (non solo controllati o deselezionati)? – Maverik

risposta

5

Ecco un breve codice che ho preparato per iniziare. Ho presupposto che è possibile idratare la proprietà RoleIsMember quando si crea l'utente dell'applicazione. Ho preso il percorso più semplice avendo tutti i ruoli in tutti gli utenti (enum flags sarebbe stato il migliore, ma dati i tuoi dati, non sono sicuro che sia un'opzione senza un impianto idraulico). Ho usato colonne minime per far passare l'idea. Se si implementa almeno INotifyPropertyChanged su Ruoli, è possibile collegarsi alla notifica e ripristinarla nel database quando le caselle di controllo cambiano sul front-end.


principale Xaml

<DataGrid DataContext="{StaticResource ResourceKey=AllUsers}" ItemsSource="{Binding}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding GivenName}" /> 
     <DataGridTextColumn Binding="{Binding Surname}" /> 
     <DataGridTemplateColumn> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ItemsControl ItemsSource="{Binding ApplicationRoles}"> 
         <ItemsControl.ItemTemplate> 
          <DataTemplate> 
           <CheckBox Content="{Binding RoleName}" IsChecked="{Binding IsMember, Mode=TwoWay}" /> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

dati Xaml

<x:Array x:Key="AllUsers" Type="Sample:ApplicationUser"> 
    <Sample:ApplicationUser GivenName="Andrew" Surname="Fuller"> 
     <Sample:ApplicationUser.ApplicationRoles> 
      <Sample:Role RoleName="Administrators" IsMember="True"/> 
      <Sample:Role RoleName="Shift Analysts"/> 
      <Sample:Role RoleName="Shift Managers" IsMember="True"/> 
     </Sample:ApplicationUser.ApplicationRoles> 
    </Sample:ApplicationUser> 
    <Sample:ApplicationUser GivenName="Anne" Surname="Dodsworth"> 
     <Sample:ApplicationUser.ApplicationRoles> 
      <Sample:Role RoleName="Administrators"/> 
      <Sample:Role RoleName="Shift Analysts" IsMember="True"/> 
      <Sample:Role RoleName="Shift Managers" IsMember="True"/> 
     </Sample:ApplicationUser.ApplicationRoles> 
    </Sample:ApplicationUser> 
</x:Array> 

Le definizioni di classe

public class ApplicationUser 
{ 
    public Guid? UserId { get; set; } 
    public string GivenName { get; set; } 
    public string Surname { get; set; } 
    public string EmailAddress { get; set; } 
    public string UserPhone { get; set; } 
    public string NtLoginName { get; set; } 
    public List<Role> ApplicationRoles { get; set; } 

    public ApplicationUser() 
    { 
     ApplicationRoles = new List<Role>(); 
    } 
} 

public class Role 
{ 
    public Guid RoleId { get; set; } 
    public string RoleName { get; set; } 
    public string RoleDescription { get; set; } 

    public bool IsMember { get; set; } 
} 

risultati

Screenshot

+0

Fatto e spolverato. Le prime impressioni erano corrette - è una risposta assolutamente super. Grazie mille! – noonand

+0

Felice di aiutare :) – Maverik

2

Se la colonna Ruoli visualizza sempre lo stesso elenco di ruoli, è possibile associare facilmente un controllo ListView all'elenco di tutti i ruoli con un ItemTemplate creato da un CheckBox e un TextBlock.
Quindi, è possibile associare facilmente la proprietà IsChecked del CheckBox ai ruoli utente e utilizzare un convertitore che restituisce True se il ruolo si trova nell'elenco dei ruoli utente.

+0

Puoi espandere su questo con qualche codice di esempio, forse? – noonand