2015-10-12 2 views
0

My Model:

public class Cont: INotifyPropertyChanged 
{ 

    private string _Contact; 
    public string Contact 
    { 
     get { return _Contact; } 
     set 
     { 
      _Contact= value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Contact")); 
     } 
    } 

    private string _Age; 
    public string Age 
    { 
     get { return _Age; } 
     set 
     { 
      _Age = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Age")); 
     } 
    } 

Мой CollectionViewSource:

<CollectionViewSource x:Key="group" Source="{Binding GroupedCollection}" ItemsPath="{Binding GroupedCollection[0].ContactColl}" IsSourceGrouped="True"> 
      </CollectionViewSource> 

Мой GridView:

<GridView ItemsSource="{Binding Source={StaticResource group}}" 
      SelectionMode="None" ScrollViewer.VerticalScrollBarVisibility="Hidden"> 
      <GridView.GroupStyle> 
       <GroupStyle HidesIfEmpty="True"> 
        <GroupStyle.HeaderTemplate> 
         <DataTemplate> 
          <TextBlock x:Name="keyHeader" Text="{Binding Key}"/> 
         </DataTemplate> 
        </GroupStyle.HeaderTemplate> 
       </GroupStyle> 
      </GridView.GroupStyle> 
      <GridView.ItemTemplate> 
       <DataTemplate> 
         <TextBlock Text="{Binding Contact}"/> 
       </DataTemplate> 
      </GridView.ItemTemplate> 

     </GridView> 

Мой ViewModel:

public class ContVM: INotifyPropertyChanged 
{ 
    public ObservableCollection<Cont> Contlist = new ObservableCollection<Cont>(); 

    private ObservableCollection<ContItem> _GroupedCollection; 
    public ObservableCollection<ContItem> GroupedCollection 
    { 
     get 
     { 
      if (_GroupedCollection == null) 
      { 
       _GroupedCollection= new ObservableCollection<ContItem>(); 
      } 
      return _GroupedCollection; 
     } 
     set 
     { 
      _GroupedCollection = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("GroupedCollection")); 
     } 
    } 

    public void SetInitialCollection() 
    { 
     var keyList = Contlist .GroupBy(c => c.Age).Select(g => g.Key); 
     foreach (var key in keyList) 
     { 
      var contItem= new ContItem(); 
      contItem.Key = key; 
      var contList = Contlist.Where(c => c.Age == key); 
      foreach (var item in contList) 
      { 
       contItem.ContactColl.Add(item); 
      } 
      GroupedCollection.Add(contItem); 
     } 
    } 

    public void AddNew(Cont Item) 
    { 
     var contItem = GroupedCollection.FirstOrDefault(g => g.Key == Item.Age); 
     if (contItem != null) 
     { 
      contItem.ContactColl.Add(Item); 
     } 
     else 
     { 
      contItem = new ContItem(); 
      contItem.Key = Item.Age ; 
      GroupedCollection.Add(contItem); 
     } 
    } 

    public void Delete(Cont Item) 
    { 
     var contItem = GroupedCollection.FirstOrDefault(g => g.Key == Item.Age); 
     if (contItem != null) 
     { 
      if (contItem.ContactColl.Contains(Item)) 
      { 
       contItem.ContactColl.Remove(Item); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class ContItem : INotifyPropertyChanged 
{ 
    public string Key { get; set; } 

    private ObservableCollection<Cont> _ContactColl; 
    public ObservableCollection<Cont> ContactColl 
    { 
     get 
     { 
      if (_ContactColl== null) 
      { 
       _ContactColl= new ObservableCollection<Cont>(); 
      } 
      return _ContactColl; 
     } 
     set 
     { 
      _ContactColl= value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("ContactColl")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

Мой код-за CS:

ContVM vm = new ContVM(); 

private void Add_new_cont_Click(object sender, RoutedEventArgs e) 
{ 
    // a button that add a new data from 2 textbox 
    Cont item = new Cont(); 
    item.Contact = textbox1.Text; 
    item.Contact = textbox2.Text; 

    vm.AddNew(item); // error line 
} 

Уже попробовал это, но я получаю ошибку 0xC0000005: Access violation reading location 0x00000004. и перенаправить меня на линии, которая vm.AddNew(item);. Все эти коды были обновлены/управляются @Bells.Манипулирование Коллекция внутри ViewModel от Code-Behind

+0

Вы восстанавливаете всю коллекцию при удалении одного элемента? или просто удалить удаленный элемент из коллекции? – Bells

+0

@Bells просто удаляет удаленный элемент .. вот так: 'ObservableCollection.Remove (Item);' – rydev

+0

@Bells, вы знаете, как это сделать? Или вы можете предложить, что мне следует читать/изучать, чтобы решить эту проблему? – rydev

ответ

1

Каждый раз, когда в коллекцию добавляется новый элемент, вы перегруппируете элементы и перезагружаете источник. Это приведет к тому, что вид сетки сбросит свое положение. Чтобы сохранить позицию, вы должны сначала назначить исходную коллекцию, как ItemsSource, и манипуляции должны выполняться в одной коллекции.

public class Cont 
    { 
     public string Contact { get; set; } 
     public string Age { get; set; } 
    } 

    public class ContItem 
    { 
     public string Key { get; set; } 

     private ObservableCollection<Cont> _contactColl; 
     public ObservableCollection<Cont> ContactColl 
     { 
      get 
      { 
       if (_contactColl == null) 
        _contactColl = new ObservableCollection<Cont>(); 
       return _contactColl; 
      } 

     } 
    } 

    public class TestClass 
    { 
     public ObservableCollection<Cont> Contlist = new ObservableCollection<Cont>(); 
     private ObservableCollection<ContItem> _groupedCollection; 
     public ObservableCollection<ContItem> GroupedCollection 
     { 
      get 
      { 
       if (_groupedCollection == null) 
        _groupedCollection = new ObservableCollection<ContItem>(); 
       return _groupedCollection; 
      } 
     } 

     public void SetInitialCollection() 
     { 
      //Add the existing items in ContactList (if any) to a grouped collection. 

      var keyList = Contlist.GroupBy(c => c.Age).Select(g => g.Key); 
      foreach (var key in keyList) 
      { 
       var contItem = new ContItem(); 
       contItem.Key = key; 
       var contList = Contlist.Where(c => c.Age == key); 
       foreach (var item in contList) 
       { 
        contItem.ContactColl.Add(item); 
       } 
       GroupedCollection.Add(contItem); 
      } 

     } 

     public void AddNewItem() 
     { 
      var cont = new Cont(); 
      cont.Age = "32"; 
      cont.Contact = ""; 
      var contItem = GroupedCollection.FirstOrDefault(g => g.Key == cont.Age); 
      if (contItem != null) 
      { 
       contItem.ContactColl.Add(cont); 
      } 
      else 
      { 
       contItem = new ContItem(); 
       contItem.Key = cont.Age; 
       contItem.ContactColl.Add(cont); 
       GroupedCollection.Add(contItem); 
      } 
     } 

     public void DeleteItem(Cont cont) 
     { 
      var contItem = GroupedCollection.FirstOrDefault(g => g.Key == cont.Age); 
      if (contItem != null) 
      { 
       if (contItem.ContactColl.Contains(cont)) 
       { 
        contItem.ContactColl.Remove(cont); 
       } 
      } 
     } 
    } 


<CollectionViewSource x:Key="group" Source="{Binding GroupedCollection}" 
       ItemsPath="ContactColl" IsSourceGrouped="True" /> 
+0

уже обновил вопрос. Я получаю новую ошибку. Спасибо за ваше время, вы были очень полезны. – rydev

Смежные вопросы