2010-11-21 17 views
14

मैं समझ नहीं पा रहा हूं कि मैं क्या गलत कर रहा हूं। मैं सूची दृश्य में आइटम समूह करना चाहता हूँ।सूची दृश्य में एमवीवीएम ग्रुपिंग आइटम

enter image description here

It'm MVVM पद्धति का उपयोग कर: परिणाम में मैं ऐसा ही कुछ देखना चाहते हैं। यह मेरा एक्सएएमएल कोड है।

<CollectionViewSource x:Key="EmploeeGroup"        
         Source="{Binding Path=AllEmploees}"> 
    <CollectionViewSource.GroupDescriptions> 
    <PropertyGroupDescription PropertyName="FirstName" /> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

<ListView AlternationCount="2" 
      DataContext="{StaticResource EmploeeGroup}" 
      ItemsSource="{Binding IsAsync=True}" Padding="0,0,0,10"> 
    <ListView.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.ContainerStyle> 
     <Style TargetType="{x:Type GroupItem}"> 
      <Setter Property="Margin" Value="0,0,0,5"/> 
      <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type GroupItem}"> 
       <Expander IsExpanded="True" BorderBrush="#FFA4B97F" 
              BorderThickness="0,0,0,1"> 
        <Expander.Header> 
        <DockPanel> 
         <TextBlock FontWeight="Bold" 
           Text="Name: "/> 
         <TextBlock FontWeight="Bold" 
           Text="{Binding Path=FirstName}"/> 
        </DockPanel> 
        </Expander.Header> 
        <Expander.Content> 
        <ItemsPresenter /> 
        </Expander.Content> 
       </Expander> 
       </ControlTemplate> 
      </Setter.Value> 
      </Setter> 
     </Style> 
     </GroupStyle.ContainerStyle> 
    </GroupStyle> 
    </ListView.GroupStyle> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Width="150" 
         Header="FirstName" 
         DisplayMemberBinding="{Binding Path=FirstName}"/> 
     <GridViewColumn Width="150" 
         Header="LastName" 
         DisplayMemberBinding="{Binding Path=LastName}"/> 
    </GridView> 
    </ListView.View> 
</ListView> 

यह मेरी EmploeeListViewModel.cs

public class EmploeeListViewModel: ViewModelBase 
{ 
    readonly EmploeeRepository _emploeeRepository; 

    private ObservableCollection<EmploeeViewModel> _allmpl; 
    public ObservableCollection<EmploeeViewModel> AllEmploees 
    { 
    get 
    { 
     if (_allmpl == null) 
     { 
     _allmpl = new ObservableCollection<EmploeeViewModel>(); 
     CreateAllEmploee(); 
     } 
     return _allmpl; 
    } 
    } 

    public EmploeeListViewModel(EmploeeRepository emploeeRepository) 
    { 
    if (emploeeRepository == null) 
     throw new ArgumentNullException("emploeeRepository"); 

    _emploeeRepository = emploeeRepository; 
    _emploeeRepository.EmploeeAdded += this.OnEmploeeAddedToRepository; 
    } 

private void CreateAllEmploee() 
{ 
    List<EmploeeViewModel> all = 
       (from emploee in _emploeeRepository.GetEmploees() 
       select new EmploeeViewModel(emploee)).ToList(); 
    foreach (EmploeeViewModel evm in all) 
    { 
    evm.PropertyChanged += this.OnEmploeeViewModelPropertyChanged; 
    AllEmploees.Add(evm); 
    } 
    this.AllEmploees.CollectionChanged += this.OnCollectionChanged; 
} 

//this.OnCollectionChanged; 
//this.OnEmploeeViewModelPropertyChanged; 
} 

EmploeeViewModel.cs

public class EmploeeViewModel : ViewModelBase 
{ 
    #region Fields 
    Emploee _emploee; 
    bool _isSelected; 
    #endregion 

    #region Constructor 
    public EmploeeViewModel(Emploee emploee) 
    { 
     if (emploee == null) 
     throw new ArgumentNullException("emploee"); 
     this._emploee = emploee; 
    } 
    #endregion 

    #region Emploee Properties 
    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
     if (value == _isSelected) 
      return; 

     _isSelected = value; 
     base.OnPropertyChanged("IsSelected"); 
     } 
    } 

    public string FirstName 
    { 
     get { return _emploee.FirstName; } 
     set 
     { 
     if (value == _emploee.FirstName) 
      return; 
     _emploee.FirstName = value; 
     base.OnPropertyChanged("FirstName"); 
     } 
    } 

    public string LastName 
    { 
     get { return _emploee.LastName; } 
     set 
     { 
     if (value == _emploee.LastName) 
      return; 
     _emploee.LastName = value; 
     base.OnPropertyChanged("LastName"); 
     } 
    } 
    #endregion 
} 
  • है क्यों मैं Expander.Headerसाथ बाध्य नहीं कर सकते हैं "प्रथम" संपत्तिटेक्स्टब्लॉक?
  • मैं क्यों आपत्ति प्रकार
    MS.Internal.Data.CollectionViewGroupInternal Expander.Header अंदर (अगर मैं अंदर Expander.Header पाठ लिखा = "{बाइंडिंग}") है>?

मैं कैसे बदल चाहिए मेरी XAML या .cs कोड these results निर्माण करने के लिए?

उत्तर

20

मुझे अपने आप से इस प्रश्न का उत्तर मिला।

कनवर्टर में भेजा गया ऑब्जेक्ट प्रकार का है: MS.Internal.Data.CollectionViewGroupInternal।

मुख्य कारण है कि समूह नाम डेटाबेस के लिए "नाम" का उपयोग करना मुख्य कारण है क्योंकि यह संग्रह दृश्य समूह समूह में संपत्ति है जिसमें वर्तमान "समूह संग्रह" नाम है (आपके द्वारा निर्दिष्ट समूह विवरण के अनुसार)।

महत्वपूर्ण नहीं संपत्ति समूह समूह में ग्रोपर्टी नाम क्या था। आपको हमेशा समूह स्टाइल कंटेनर में {बाइंडिंग पथ = नाम} का उपयोग करना है।

मुझे अपने एक्सएएमएल में केवल एक स्ट्रिंग को बदलना पड़ा।

से:

<TextBlock FontWeight="Bold" Text="{Binding Path=FirstName}"/> 

करने के लिए:

<TextBlock FontWeight="Bold" Text="{Binding Path=Name}"/> 
+0

मुझे आश्चर्य है कि कैसे कई PropertyGroupDescriptions के साथ ऐसा करना ... – Sven

+1

यह बहुत बाजार है। मैंने इसे इस पोस्ट में देखा है http://www.wpf-tutorial.com/listview-control/listview-grouping/ और सोचा कि यह एक टाइपो हो सकता है। पृथ्वी पर क्यों यह हमेशा "नाम" होना चाहिए, लेकिन वास्तविक बाध्यकारी का नाम नहीं होना चाहिए !!! चीयर्स दोस्त। – Mehrad

+1

"नाम" उस संपत्ति का नाम है जिसमें आपके द्वारा समूहित आइटम है। आपके पास आइटम का एक समूह है जिसमें से सभी फर्स्टनाम साझा करते हैं और "नाम" संपत्ति में सामान्य मान होता है। जब आप एक जटिल प्रकार पर समूह करते हैं तो यह अधिक स्पष्ट हो जाता है। –

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