简体   繁体   English

从Code-Behind中操作ViewModel内部的Collection

[英]Manipulating Collection inside ViewModel from Code-Behind

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

My CollectionViewSource: 我的CollectionViewSource:

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

My GridView : 我的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>

My ViewModel : 我的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;
}

My code-behind cs : 我背后的代码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
}

Already tried this, but I get error 0xC0000005: Access violation reading location 0x00000004. 已经尝试过此操作,但出现错误0xC0000005: Access violation reading location 0x00000004. and it redirect me at line which is vm.AddNew(item); 然后将我重定向到vm.AddNew(item); . All these codes have been updated/guided by @Bells. 所有这些代码已由@Bells更新/指导。

Each time when a new item is being added to the collection, you are regrouping the items and resetting the source. 每次将新项目添加到集合中时,您都在重新组合项目并重置源。 That will cause the grid view to reset its position. 这将导致网格视图重置其位置。 In order to maintain the position, you have to assign a source collection initially as the ItemsSource and manipulations should be done on the same collection. 为了保持位置,您必须最初分配一个源集合作为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" />

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM