2014-06-10 3 views
6

मैं सी # और डब्ल्यूपीएफ का उपयोग कर रहा हूं और मेरे पास एक सूची दृश्य है जिसमें पहले कॉलम में चेकबॉक्स के साथ आइटम हैं। ListView के आइटम्ससोर्स को कोड में सेट किया गया है (बाइंडिंग के माध्यम से नहीं) और गुण 'नाम', 'टाइप' और 'चयनित' के साथ कक्षा 'आइटम' के उदाहरण शामिल हैं।समूहबद्ध वस्तुओं के साथ सूची दृश्य - समूह शीर्षलेख चेकबॉक्स के माध्यम से सभी समूह सदस्यों का चयन करें

public class Item : INotifyPropertyChanged 
{ 
    private string _name; 
    private bool _selected; 
    private string _type; 

    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      this.OnPropertyChanged(); 
     } 
    } 

    public bool Selected 
    { 
     get { return _selected; } 
     set 
     { 
      _selected = value; 
      this.OnPropertyChanged(); 
     } 
    } 

    public string Type 
    { 
     get { return _type; } 
     set 
     { 
      _type = value; 
      this.OnPropertyChanged(); 
     } 
    } 

    protected virtual void OnPropertyChanged([CallerMemberName] string property = "") 
    { 
     if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(property)); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

ListView के दृश्य पहले कॉलम एक चेकबॉक्स है कि चयनित संपत्ति के लिए बाध्य है के साथ एक GridView के लिए निर्धारित है - चेकबॉक्स जैसे 'चुना' किया जा रहा का प्रतीक है।

मैं इस सूची दृश्य (समूह 'प्रकार' द्वारा समूहित) में समूह जोड़ रहा हूं, और ग्रुप स्टाइल में एक चेकबॉक्स भी है।

<ListView x:Name="listview"> 

     <!-- View --> 
     <ListView.View> 
      <GridView> 
       <GridViewColumn Width="50"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate DataType="cls:Item"> 
          <CheckBox IsChecked="{Binding Selected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 

       <GridViewColumn Width="300" Header="Name" DisplayMemberBinding="{Binding Name, UpdateSourceTrigger=PropertyChanged}"></GridViewColumn> 

       <GridViewColumn Width="100" Header="Type" DisplayMemberBinding="{Binding Type}"></GridViewColumn> 
      </GridView> 
     </ListView.View> 

     <!-- Group style --> 
     <ListView.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate> 
            <Expander IsExpanded="True"> 
             <Expander.Header> 
              <StackPanel Orientation="Horizontal"> 
               <CheckBox></CheckBox> 
               <TextBlock Text="{Binding Name}" /> 
               <TextBlock Text="{Binding ItemCount, StringFormat='- {0} item(s)'}" /> 
              </StackPanel> 
             </Expander.Header> 
             <ItemsPresenter /> 
            </Expander> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </ListView.GroupStyle> 
    </ListView> 
अंत पर मेरे सवाल का

: क्या मैं ऐसा करना चाहते हैं समूह में चेकबॉक्स का उपयोग करने में सक्षम होना है

 var lst = new List<Item>(); 
     lst.Add(new Item { Name = "A", Type = "1" }); 
     lst.Add(new Item { Name = "B", Type = "1" }); 
     lst.Add(new Item { Name = "C", Type = "1" }); 
     lst.Add(new Item { Name = "A", Type = "2" }); 
     lst.Add(new Item { Name = "B", Type = "2" }); 
     lst.Add(new Item { Name = "C", Type = "2" }); 

     listview.ItemsSource = lst; 

     var view = CollectionViewSource.GetDefaultView(lst); 
     view.GroupDescriptions.Add(new PropertyGroupDescription("Type")); 

ListView के लिए XAML GridView और GroupStyle शामिल हेडर उस विशेष समूह में सभी या किसी भी आइटम का चयन करने के लिए।

Example

समूह हैडर चेकबॉक्स क्लिक करने पर उस विशेष समूह में सभी आइटम का चयन करना चाहिए अगर वे अभी तक चयनित नहीं हैं: उदाहरण के लिए। इसे फिर से क्लिक करने के बाद उस समूह में सभी आइटमों को डि-सिलेक्ट (अनचेक) करना चाहिए। यदि उपयोगकर्ता समूह में कुछ आइटम मैन्युअल रूप से चुनता है या अचयनित करता है, तो समूह हेडर चेकबॉक्स के लिए अनिश्चित स्थिति दिखाने के लिए अच्छा होगा, लेकिन अनचेक किया गया भी अच्छा होगा।

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

मैं एमवीवीएम का सख्ती से पालन नहीं कर रहा हूं इसलिए मुझे बाइंडिंग में और मेरे व्यूमोडेल में ऐसा करने की चिंता न करें, मैं चेकबॉक्स की जांच की गई घटना को सुनकर कुछ और ठीक कर दूंगा जो किसी भी तरह कोड में पता लगा रहा है जांच की जानी चाहिए। उदाहरण के लिए; अगर मैं चेक किए गए ईवेंट को सुन सकता हूं और किसी भी तरह से समूह के प्रकार को निकाला जाता हूं तो मैं ज्यादातर सेट करूँगा (मैं पूरी सूची में जा सकता हूं और मिलान करने वाले समूह के साथ उन सभी का चयन कर सकता हूं)। लेकिन मुझे ऐसा करने का कोई तरीका भी नहीं दिखता है; मैं चेक किए गए ईवेंट (प्रेषक) में चेकबॉक्स प्राप्त कर सकता हूं, और मैं सभी अभिभावकों के नियंत्रण में लूप कर सकता हूं लेकिन कहीं भी मैं उस संपत्ति के बारे में जानकारी निकालने का कोई तरीका नहीं देख रहा हूं जिस पर मैं समूह कर रहा हूं ...

कोई भी मदद बहुत अच्छा होगा!

उत्तर

0

समूह हेडर की जांच होने पर आप संभाल सकते हैं और फिर समूह में आइटम्स के माध्यम से लूप कर सकते हैं और Ischecked को सत्य पर सेट कर सकते हैं।

+0

लेकिन मैं समूह में आइटम कैसे प्राप्त करूं? मुझे उस संपत्ति के मूल्य को जानना होगा जिसे मैं समूहबद्ध कर रहा हूं, या समूह वस्तुओं को किसी अन्य तरीके से प्राप्त कर सकता हूं, और मुझे उन्हें प्राप्त करने का कोई तरीका नहीं मिल रहा है। –

2

मैंने इसे समझ लिया, मुझे बस चेकबॉक्स का डेटाकॉन्टेक्स्ट था। यह सबसे पुराना समाधान नहीं है (निश्चित रूप से एमवीवीएम नहीं) लेकिन ऐसा लगता है कि यह ठीक काम करता है।

समूह शैली में चेकबॉक्स में चेक किए गए और अनचेक किए गए ईवेंट हैंडलर जोड़ें, डेटाकॉन्टेक्स्ट को एक संग्रह दृश्य समूह में डालें जिसमें आइटम शामिल हैं।

के मामले में आइटम संग्रह CollectionViewGroup का एक और उदाहरण शामिल समूहीकरण, तो आप की जरूरत नेस्ट को रिकर्सिवली पाश उन वस्तुओं के माध्यम से जब आप किसी अन्य (नेस्टेड) ​​समूह मिलता है:

private void OnGroupChecked(object sender, RoutedEventArgs e) 
    { 
     this.HandleGroupCheck((CheckBox)sender, true); 
    } 

    private void OnGroupUnchecked(object sender, RoutedEventArgs e) 
    { 
     this.HandleGroupCheck((CheckBox)sender, false); 
    } 

    private void HandleGroupCheck(CheckBox sender, bool check) 
    { 
     var group = (CollectionViewGroup) sender.DataContext; 
     this.HandleGroupCheckRecursive(group, check); 
    } 

    private void HandleGroupCheckRecursive(CollectionViewGroup group, bool check) 
    { 
     foreach (var itemOrGroup in group.Items) 
     { 
      if (itemOrGroup is CollectionViewGroup) 
      { 
       // Found a nested group - recursively run this method again 
       this.HandleGroupCheckRecursive(itemOrGroup as CollectionViewGroup, check); 
      } 
      else if (itemOrGroup is Item) 
      { 
       var item = (Item)itemOrGroup; 
       item.Selected = check; 
      } 
     } 
    } 

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

+0

क्या आप इस के लिए समाधान के साथ आए थे? – SZT

संबंधित मुद्दे