2012-06-01 12 views
8

tengo algunas funciones de administración de usuarios en una aplicación de WPF que estoy escribiendo actualmente y me gustaría que sea un poco más intuitivo para el usuario finalMejora de la visualización de una columna en particular en una vista de cuadrícula WPF

I Me gustaría poder proporcionar algún tipo de medio para editar fácilmente la lista de roles a los que pertenece un usuario determinado. Por el momento la red se llena, como resultado de la unión a un List<ApplicationUser>

ApplicationUser es mi propia clase define como:

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; } 
} 

Como se puede observar las funciones que el usuario se llevan a cabo en un List<Role> . Role es mi propia clase define como:

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

La maqueta a continuación representa el estado actual en el que apenas consigo los papeles en forma de lista y mediante el uso de un convertidor de solo mostrar los papeles como nueva línea separa las cadenas en el gridview

Current state of gridview

Sin embargo, esto es lo que me gustaría lograr hacer alternar de vez en cuando la composición de diversos grupos fáciles.

Desired state of gridview

Ahora que lo pienso, probablemente voy a tener que cambiar la definición del papel para incluir una propiedad IsMember para facilitar la unión en la casilla, pero si alguien tiene una mejor manera de que voy a recibir como bien. Puedo cambiar el tipo JOIN en el sproc, así que recupero todos los roles con una consulta sobre un usuario en particular y llego a la propiedad IsMember en consecuencia.

¡Gracias por su tiempo!

+0

hizo esto nunca se resuelven? Siento por la respuesta a continuación que no fue así y que podría ayudarte si aún necesitas esto. – Maverik

+0

@Maverik - nunca resuelto. Estaba revisándolo hoy después de un desvío prolongado a otras áreas de la aplicación. Estaba viendo la respuesta propuesta por Tamir Dresher, pero trabajaré contigo si puedes ... – noonand

+0

Bueno, su idea es correcta, pero a juzgar por los datos proporcionados, no parece tan sencillo, como podría parecer por su respuesta. ¿Su lista de roles totales estática o cambia a lo largo del tiempo con nuevos roles agregados o antiguos eliminados por completo (no solo marcados o desmarcados)? – Maverik

Respuesta

5

Aquí hay un pequeño fragmento de código que he mejorado para empezar. Supongo que puede hidratar la propiedad IsMember de la clase Role cuando crea el usuario de la aplicación. Tomé la ruta más fácil al tener todos los roles en todos los usuarios (enum flags habría sido lo mejor, pero teniendo en cuenta sus datos, no estoy seguro de que sea una opción sin algunas cañerías). He usado columnas mínimas para transmitir la idea. Si implementa INotifyPropertyChanged en Roles al menos, puede conectar la notificación y conservarla nuevamente en la base de datos cuando las casillas de verificación cambien en la interfaz.


principal 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> 

datos 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> 

Las definiciones de clases

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; } 
} 

de Resultados

Screenshot

+0

Hecho y espolvoreado. Las primeras impresiones fueron correctas, es una respuesta absolutamente genial. ¡Muchas gracias siempre! – noonand

+0

Feliz de ayudar :) – Maverik

2

Si la columna Roles siempre muestra la misma lista de roles, puede vincular fácilmente un ListView a la lista de todas las funciones con una ItemTemplate creada a partir de un CheckBox y un TextBlock.
Luego, puede vincular fácilmente la propiedad IsChecked de CheckBox a las funciones de usuario y usar un convertidor que devuelva True si la función está en la lista Roles de usuario.

+0

¿Puede ampliar esto con algún código de muestra, tal vez? – noonand

Cuestiones relacionadas