2012-06-01 9 views
8

मुझे लगता है कि मैं वर्तमान में लिख रहा हूँ एक WPF अनुप्रयोग में कुछ उपयोगकर्ता व्यवस्थापक कार्यक्षमता है और उसे कुछ अतिरिक्त अंत उपयोगकर्ताएक WPF ग्रिड दृश्य

मैं के लिए सहज बनाने के लिए चाहते हैं के किसी खास कॉलम के प्रदर्शन को बढ़ाना किसी दिए गए उपयोगकर्ता से संबंधित भूमिकाओं की सूची को आसानी से संपादित करने के कुछ प्रकार प्रदान करने में सक्षम होना पसंद है। फिलहाल ग्रिड एक List<ApplicationUser>

ApplicationUser के लिए बाध्य करने का एक परिणाम के रूप में भर जाता है अपने ही वर्ग के रूप में परिभाषित किया गया है:

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

के रूप में भूमिकाओं है कि उपयोगकर्ता में एक List<Role> में आयोजित कर रहे है देखा जा सकता है । Role अपने ही वर्ग के रूप में परिभाषित किया गया है:

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

नीचे mockup वर्तमान राज्य है जहां मैं बस के रूप में नई लाइन में तार अलग बस भूमिकाओं प्रदर्शित एक सूची के रूप में और एक कनवर्टर के उपयोग के माध्यम भूमिकाओं पाने का प्रतिनिधित्व करता है gridview

Current state of gridview

हालांकि इस मैं बंद टॉगल और विभिन्न समूहों के आसान की सदस्यता पर बनाने के लिए प्राप्त करना चाहते हैं क्या है।

Desired state of gridview

अब मैं इसके बारे में लगता है कि मैं शायद भूमिका की परिभाषा को बदलने के लिए चेकबॉक्स पर बाध्यकारी की सुविधा के लिए एक IsMember संपत्ति में शामिल करना होगा, लेकिन मुझे लगता है कि का स्वागत करता हूँ अगर किसी को भी एक बेहतर तरीका है के रूप में कुंआ। मैं जॉइन प्रकार को स्पोक में बदल सकता हूं, इसलिए मैं किसी विशेष उपयोगकर्ता के बारे में एक प्रश्न के साथ सभी भूमिकाएं वापस लेता हूं और तदनुसार IsMember संपत्ति भरता हूं।

आपके समय के लिए धन्यवाद!

+0

यह कभी हल हो गए थे? मुझे नीचे दिए गए उत्तर से लगता है कि यह नहीं था और यदि आपको अभी भी इसकी आवश्यकता है तो मैं आपकी सहायता कर सकता हूं। – Maverik

+0

@Maverik - कभी हल नहीं किया गया। मैं ऐप के अन्य क्षेत्रों में लंबे समय तक चक्कर लगाने के बाद आज इसे फिर से देख रहा था। मैं तामिर ड्रेशर के प्रस्तावित उत्तर को देख रहा था लेकिन यदि आप कर सकते हैं तो आप के साथ काम करेंगे ... – noonand

+0

वैसे उनका विचार सही है लेकिन दिए गए आंकड़ों का न्याय करते हुए, यह सीधे आगे नहीं लगता है, क्योंकि यह उनके उत्तर से दिखाई दे सकता है। क्या आपकी कुल भूमिकाओं की सूची स्थैतिक है या क्या यह समय के साथ बदलती है जिसमें नई भूमिकाएं शामिल की जाती हैं या पुराने लोग पूरी तरह से हटा दिए जाते हैं (केवल चेक या अनचेक नहीं)? – Maverik

उत्तर

5

यहां कोड का एक छोटा टुकड़ा है जिसे मैंने शुरू करने के लिए दबाया है। मैंने माना है कि जब आप एप्लिकेशन उपयोगकर्ता बनाते हैं तो Role कक्षा की IsMember संपत्ति को हाइड्रेट कर सकते हैं। मैंने सभी उपयोगकर्ताओं में सभी भूमिकाओं को लेकर सबसे आसान मार्ग लिया है (enum flags सबसे अच्छा होगा लेकिन आपका डेटा दिया गया है, मुझे यकीन नहीं है कि कुछ नलसाजी के बिना यह विकल्प है)। मैंने विचार प्राप्त करने के लिए न्यूनतम कॉलम का उपयोग किया है। यदि आप कम से कम भूमिकाओं पर INotifyPropertyChanged लागू करते हैं, तो आप अधिसूचना तक पहुंच सकते हैं और चेक-बॉक्स फ्रंट एंड पर बदलते समय इसे डेटाबेस में वापस रख सकते हैं।


मुख्य 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> 

डाटा 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> 

कक्षा परिभाषाओं

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

परिणाम

Screenshot

+0

हो गया और धूल। पहला इंप्रेशन सही था - यह एक बिल्कुल सुपर जवाब है। बहुत बहुत धन्यवाद! – noonand

+0

मदद करने के लिए खुश :) – Maverik

2

यदि भूमिका कॉलम हमेशा भूमिकाओं की एक ही सूची प्रदर्शित करता है, तो आप चेकबॉक्स और टेक्स्टब्लॉक से बने आइटम टेम्पलेट के साथ सभी भूमिकाओं की सूची में सूची दृश्य को आसानी से बांध सकते हैं।
फिर, आप आसानी से उपयोगकर्ता भूमिकाओं में चेकबॉक्स की IsChecked संपत्ति को बाध्य कर सकते हैं और एक कनवर्टर का उपयोग कर सकते हैं जो भूमिका निभाता है यदि भूमिका उपयोगकर्ता भूमिका सूची में है।

+0

क्या आप इस पर कुछ नमूना कोड के साथ विस्तार कर सकते हैं? – noonand