2014-06-10 24 views
6

C# ve WPF kullanıyorum ve ilk sütunda bir CheckBox'la öğeleri barındıran bir ListView'im var. ListView'in ItemsSource kodu (kod ile değil) olarak ayarlanır ve 'Name', 'Type' ve 'Selected' özelliklerine sahip bir 'Item' sınıfının örneklerini içerir.Gruplandırılmış öğelerle birlikte ListView - grup üstbilgisi yoluyla tüm grup üyelerini seçin onay kutusu

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 Görünüm ilk sütuna Seçilen özelliğine bağlı bir onay kutusu ile bir GridView ayarlanır - onay kutusunun mesela 'seçilen' ediliyor yapılmadığını gösterir.

Bu ListView grubuna gruplama ekliyorum ('Type' grubuna göre gruplandırılmış) ve GroupStyle da bir CheckBox içeriyor. Sorumun Nihayet üzerine

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

: ne olmasını istiyorum grubunda CheckBox kullanabilmek için olmaktır

 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 ve GroupStyle içeriyor İlgili gruptaki öğelerin tümünü veya hiçbirini seçmek için üstbilgi.

Example

onlar henüz seçili değilse, söz konusu grubun tüm öğeleri seçmek gerekir grup başlığı onay kutusunu tıkladığınızda Örneğin:. Tekrar tıklamak, o gruptaki tüm öğeleri seçip (işaretsiz) kaldırmalıdır. Kullanıcı bir gruptaki bazı öğeleri manuel olarak seçer veya seçimini kaldırırsa, grup başlığı onay kutusunun belirsiz bir durum göstermesi iyi olur, ancak işaretlenmemiş olması da iyi olur.

Bununla nereden başlayacağımı bilmiyorum. Grup üstbilgisinin IsChecked özelliğini bağlamanız gerektiğine inanıyorum, ancak ne hakkında bilgi vereceğimi bilemiyorum, çünkü datacontext, grup hakkında hiçbir bilgi içermeyen bir GroupDescriptor olayıdır. o grupta hangi maddeler var (sağda?).

Kesinlikle MVVM'yi takip etmiyorum, bu yüzden tüm bağlantılarda ve görüntüleme modumda yaptığım için endişelenmiyorum, onay kutusunun Checked olayını dinlemek gibi bir şeyle iyi olurdum ve bir şekilde hangi öğelerin kod içinde olduğunu fark ederdim kontrol edilmelidir. Örneğin; Checked olayını dinleyebilir ve bir şekilde grubun türünü ayıklayabilirsem, çoğunlukla set olurdu (tüm listeden geçebilir ve eşleşen gruba sahip olanları seçebilirdim). Ama bunu yapmanın bir yolunu bile görmüyorum; CheckBox olayını Checked olayında (gönderen) alabilirim ve tüm ana kontrollere geçebilirim ama hiçbir yerde gruplandırma yaptığım özellik hakkında hiçbir bilgi göremiyorum ...

Any yardım harika olurdu!

cevap

0

Grup başlığı kontrol edildikten sonra, gruptaki öğeler arasında geçiş yapabilir ve IsChecked değerini true olarak ayarlayabilirsiniz.

+0

Ama gruptaki öğeleri nasıl alabilirim? Gruplandırdığım mülkün değerini bilmem ya da grup öğelerini başka yollarla öğrenmem gerekiyor ve bunları elde etmenin bir yolunu bulamıyorum. –

2

Bunu çözdüm, tek ihtiyacım olan CheckBox'ın DataContext'iydi. Bu en eski çözüm (kesin MVVM değil) ama işe yaramaz gibi görünüyor.

İşaretli ve Denetlenmeyen olay işleyicilerini grup stilindeki onay kutusuna eklemeniz yeterlidir; DataContext'i, öğeleri içeren bir CollectionViewGroup'a dönüştürür.durumunda

ihtiyacınız yüzden, toplama CollectionViewGroup başka bir örneğini içeren öğeler gruplama iç içe yinelemeli başka (iç içe) grubunu bulmak o öğeler arasında döngü:

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

Şimdi ben hala anlamaya ihtiyacımız öğesinin öğelerini kontrol etmeye ve ilgili gruptaki onay kutusunu değiştirmeye nasıl yanıt verilir.

+0

bunun için bir çözüm buldunuz mu? – SZT