IEditableCollectionViewAddNewItem Interface
Defines methods and properties that a CollectionView implements to enable specifying adding items of a specific type.
Assembly: WindowsBase (in WindowsBase.dll)
The IEditableCollectionViewAddNewItem type exposes the following members.
| Name | Description | |
|---|---|---|
![]() | CanAddNew | Gets a value that indicates whether a new item can be added to the collection. (Inherited from IEditableCollectionView.) |
![]() | CanAddNewItem | Gets a value that indicates whether a specified object can be added to the collection. |
![]() | CanCancelEdit | Gets a value that indicates whether the collection view can discard pending changes and restore the original values of an edited object. (Inherited from IEditableCollectionView.) |
![]() | CanRemove | Gets a value that indicates whether an item can be removed from the collection. (Inherited from IEditableCollectionView.) |
![]() | CurrentAddItem | Gets the item that is being added during the current add transaction. (Inherited from IEditableCollectionView.) |
![]() | CurrentEditItem | Gets the item in the collection that is being edited. (Inherited from IEditableCollectionView.) |
![]() | IsAddingNew | Gets a value that indicates whether an add transaction is in progress. (Inherited from IEditableCollectionView.) |
![]() | IsEditingItem | Gets a value that indicates whether an edit transaction is in progress. (Inherited from IEditableCollectionView.) |
![]() | NewItemPlaceholderPosition | Gets or sets the position of the new item placeholder in the collection view. (Inherited from IEditableCollectionView.) |
| Name | Description | |
|---|---|---|
![]() | AddNew | Adds a new item to the collection. (Inherited from IEditableCollectionView.) |
![]() | AddNewItem | Adds the specified object to the collection. |
![]() | CancelEdit | Ends the edit transaction and, if possible, restores the original value to the item. (Inherited from IEditableCollectionView.) |
![]() | CancelNew | Ends the add transaction and discards the pending new item. (Inherited from IEditableCollectionView.) |
![]() | CommitEdit | Ends the edit transaction and saves the pending changes. (Inherited from IEditableCollectionView.) |
![]() | CommitNew | Ends the add transaction and saves the pending new item. (Inherited from IEditableCollectionView.) |
![]() | EditItem | Begins an edit transaction of the specified item. (Inherited from IEditableCollectionView.) |
![]() | Remove | Removes the specified item from the collection. (Inherited from IEditableCollectionView.) |
![]() | RemoveAt | Removes the item at the specified position from the collection. (Inherited from IEditableCollectionView.) |
The IEditableCollectionViewAddNewItem interface enables application developers to specify what type of object to add to a collection. This interface extends IEditableCollectionView, so you can add, edit, and remove items in a collection. IEditableCollectionViewAddNewItem adds the AddNewItem method, which takes an object that is added to the collection. This method is useful when the collection and objects that you want to add have one or more of the following characteristics:
The objects in the CollectionView are different types.
The objects do not have a default constructor.
The object already exists.
You want to add a Nothing object to the collection.
The following example enables a user to add various types of items to a collection. The user can enter a new item and submit the entry or cancel the transaction. The example gets an IEditableCollectionViewAddNewItem from the Items property of a ListBox and creates an object, whose type is determined by the user. Then the example calls the AddNewItem method to add the object to the collection.
Imports System Imports System.ComponentModel Imports System.Windows Partial Class Window1 Public Sub New() InitializeComponent() End Sub Private Sub Button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Dim viewToAddDisparateItems As IEditableCollectionViewAddNewItem = TryCast(catalogList.Items, IEditableCollectionViewAddNewItem) If Not viewToAddDisparateItems.CanAddNewItem Then MessageBox.Show("You cannot add items to the list.") Exit Sub End If ' Create a window that prompts the user to enter a new ' item to sell. Dim win As New AddItemWindow() ' Create an item, depending on which RadioButton is selected. ' Radio buttons correspond to book, cd, dvd, or other. Dim newItem As LibraryItem If CBool(Book.IsChecked) Then newItem = New Book("Enter the book title", "Enter an Author", "Enter a Genre", "Enter a call number", DateTime.Now + New TimeSpan(21, 0, 0, 0)) ElseIf CBool(cd.IsChecked) Then newItem = New MusicCD("Enter the Album", "Enter the artist", 0, "CD.******", DateTime.Now + New TimeSpan(14, 0, 0, 0)) ElseIf CBool(dvd.IsChecked) Then newItem = New MovieDVD("Enter the movie title", "Enter the director", "Enter the genre", New TimeSpan(), "DVD.******", DateTime.Now + New TimeSpan(7, 0, 0, 0)) Else newItem = New LibraryItem("Enter the title", "Enter the call number", DateTime.Now + New TimeSpan(14, 0, 0, 0)) End If ' Add the new item to the collection by calling ' IEditableCollectionViewAddNewItem.AddNewItem. ' Set the DataContext of the AddItemWindow to the ' returned item. win.DataContext = viewToAddDisparateItems.AddNewItem(newItem) ' If the user submits the new item, commit the new ' object to the collection. If the user cancels ' adding the new item, discard the new item. If CBool(win.ShowDialog()) Then viewToAddDisparateItems.CommitNew() Else viewToAddDisparateItems.CancelNew() End If End Sub End Class
The following example creates the user interface for the previous example.
<StackPanel xmlns:src="clr-namespace:IEditableCollectionViewAddItemExample"> <StackPanel.Resources> <src:LibraryCatalog x:Key="catalog"/> <!--Use AlternationConverter to create alternating background brushes to better distinguish each item. See AlternationConverter for more information.--> <AlternationConverter x:Key="BackgroundConverter"> <SolidColorBrush>LightBlue</SolidColorBrush> <SolidColorBrush>LightGray</SolidColorBrush> </AlternationConverter> <!--The DataTemplate for LibraryItem, which is the base class of the other data types.--> <DataTemplate DataType="{x:Type src:LibraryItem}"> <StackPanel> <TextBlock FontWeight="Bold">Item:</TextBlock> <TextBlock Text="{Binding Title, StringFormat={}Title: {0}}"/> <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}Due Date: {0:d} Call Number: {1}"> <Binding Path="DueDate"/> <Binding Path="CallNumber"/> </MultiBinding> </TextBlock.Text> </TextBlock> </StackPanel> </DataTemplate> <!--The DataTemplate for Book.--> <DataTemplate DataType="{x:Type src:Book}"> <StackPanel> <TextBlock FontWeight="Bold">Book:</TextBlock> <TextBlock Text="{Binding Title, StringFormat={}Title: {0}}"/> <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}Author: {0} Genre: {1}"> <Binding Path="Author"/> <Binding Path="Genre"/> </MultiBinding> </TextBlock.Text> </TextBlock> <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}Due Date: {0:d} Call Number: {1}"> <Binding Path="DueDate"/> <Binding Path="CallNumber"/> </MultiBinding> </TextBlock.Text> </TextBlock> </StackPanel> </DataTemplate> <!--The DataTemplate for MusicCD.--> <DataTemplate DataType="{x:Type src:MusicCD}"> <StackPanel> <TextBlock FontWeight="Bold">Music CD:</TextBlock> <TextBlock Text="{Binding Title, StringFormat={}Title: {0}}"/> <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}Artist: {0} Tracks: {1}"> <Binding Path="Artist"/> <Binding Path="NumberOfTracks"/> </MultiBinding> </TextBlock.Text> </TextBlock> <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}Due Date: {0:d} Call Number: {1}"> <Binding Path="DueDate"/> <Binding Path="CallNumber"/> </MultiBinding> </TextBlock.Text> </TextBlock> </StackPanel> </DataTemplate> <!--The DataTemplate for MovieDVD--> <DataTemplate DataType="{x:Type src:MovieDVD}"> <StackPanel> <TextBlock FontWeight="Bold">Movie DVD:</TextBlock> <TextBlock Text="{Binding Title, StringFormat={}Title: {0}}"/> <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}Director: {0} Genre: {1} Length: {2}"> <Binding Path="Director"/> <Binding Path="Genre"/> <Binding Path="Length"/> </MultiBinding> </TextBlock.Text> </TextBlock> <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}Due Date: {0:d} Call Number: {1}"> <Binding Path="DueDate"/> <Binding Path="CallNumber"/> </MultiBinding> </TextBlock.Text> </TextBlock> </StackPanel> </DataTemplate> </StackPanel.Resources> <!--Bind a ListBox to a collection of LibraryItem objects. The collection can hold objects any type that inherits from LibraryItem.--> <ListBox Name="catalogList" Height="350" AlternationCount="2" ItemsSource="{StaticResource catalog}"> <!--Use alternating background styles to better distinguish each item. See ItemsControl.AlternationIndex for more information.--> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=(ItemsControl.AlternationIndex), Converter={StaticResource BackgroundConverter}}"/> <Setter Property="Margin" Value="3"/> </Style> </ListBox.ItemContainerStyle> </ListBox> <!--Enable the user to choose a type of item to add to the collection.--> <TextBlock>Select an item to add:</TextBlock> <RadioButton Name="book" >Book</RadioButton> <RadioButton Name="cd">Music CD</RadioButton> <RadioButton Name="dvd">DVD</RadioButton> <RadioButton>Other</RadioButton> <Button Margin="0,3,0,0" Click="Button_Click">Add Item</Button> </StackPanel>
The following example creates the AddItemWindow in which the user adds data for a new item.
<StackPanel Margin="10" Width="250"> <StackPanel.Resources> <!--Add an event handler to select all text when a TextBox gets focus.--> <Style TargetType="TextBox"> <EventSetter Event="GotFocus" Handler="TextBoxFocus"/> </Style> <!--Create a Template for HeaderedContentControl so the header is to the left of the content.--> <Style TargetType="HeaderedContentControl"> <Setter Property="Margin" Value="2"/> <Setter Property="Focusable" Value="False"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="HeaderedContentControl"> <DockPanel LastChildFill="False"> <ContentPresenter ContentSource="Header" DockPanel.Dock="Left" Focusable="False" VerticalAlignment="Center"/> <ContentPresenter ContentSource="Content" Margin="5,0,0,0" DockPanel.Dock="Right" VerticalAlignment="Center"/> </DockPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> <Style TargetType="Button"> <Setter Property="Width" Value="100"/> <Setter Property="Margin" Value="10,15,15,15"/> </Style> <!--The DataTemplate that is used when the user enters a new LibraryItem.--> <DataTemplate DataType="{x:Type src:LibraryItem}"> <StackPanel> <HeaderedContentControl Header="Title"> <TextBox Width="150" Text="{Binding Path=Title, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Due Date"> <TextBox Width="150" Text="{Binding Path=DueDate, StringFormat=d, Mode=TwoWay}"> </TextBox> </HeaderedContentControl> <HeaderedContentControl Header="Call Number"> <TextBox Width="150" Text="{Binding Path=CallNumber, Mode=TwoWay}"/> </HeaderedContentControl> </StackPanel> </DataTemplate> <!--The DataTemplate that is used when the user enters a new Book.--> <DataTemplate DataType="{x:Type src:Book}"> <StackPanel> <HeaderedContentControl Header="Title"> <TextBox Width="150" Text="{Binding Path=Title, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Author"> <TextBox Width="150" Text="{Binding Path=Author, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Genre"> <TextBox Width="150" Text="{Binding Path=Genre, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Due Date"> <TextBox Width="150" Text="{Binding Path=DueDate, StringFormat=d, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Call Number"> <TextBox Width="150" Text="{Binding Path=CallNumber, Mode=TwoWay}"/> </HeaderedContentControl> </StackPanel> </DataTemplate> <!--The DataTemplate that is used when the user enters a new MusicCD.--> <DataTemplate DataType="{x:Type src:MusicCD}"> <StackPanel> <HeaderedContentControl Header="Title"> <TextBox Width="150" Text="{Binding Path=Title, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Artist"> <TextBox Width="150" Text="{Binding Path=Artist, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Tracks"> <TextBox Width="150" Text="{Binding Path=NumberOfTracks, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Due Date"> <TextBox Width="150" Text="{Binding Path=DueDate, StringFormat=d, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Call Number"> <TextBox Width="150" Text="{Binding Path=CallNumber, Mode=TwoWay}"/> </HeaderedContentControl> </StackPanel> </DataTemplate> <!--The DataTemplate that is used when the user enters a new MovieDVD.--> <DataTemplate DataType="{x:Type src:MovieDVD}"> <StackPanel> <HeaderedContentControl Header="Title"> <TextBox Width="150" Text="{Binding Path=Title, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Director"> <TextBox Width="150" Text="{Binding Path=Director, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Length"> <TextBox Width="150" Text="{Binding Path=Length, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Genre"> <TextBox Width="150" Text="{Binding Path=Genre, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Due Date"> <TextBox Width="150" Text="{Binding Path=DueDate, StringFormat=d, Mode=TwoWay}"/> </HeaderedContentControl> <HeaderedContentControl Header="Call Number"> <TextBox Width="150" Text="{Binding Path=CallNumber, Mode=TwoWay}"/> </HeaderedContentControl> </StackPanel> </DataTemplate> </StackPanel.Resources> <!--One of the DataTemplates that defined above is used by this ContentControl when the window is created.--> <ContentControl Content="{Binding}" /> <StackPanel Orientation="Horizontal"> <Button IsDefault="True" Click="Submit_Click">_Submit</Button> <Button IsCancel="True">_Cancel</Button> </StackPanel> </StackPanel>
The following example shows the logic for the AddItemWindow.
Imports System.Windows Imports System.Windows.Controls Partial Public Class AddItemWindow Inherits Window Public Sub New() InitializeComponent() End Sub Private Sub Submit_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) DialogResult = True Close() End Sub ' Select all text when the TextBox gets focus. Private Sub TextBoxFocus(ByVal sender As Object, ByVal e As RoutedEventArgs) Dim tbx As TextBox = TryCast(sender, TextBox) tbx.SelectAll() End Sub End Class
The following example shows the data types and collection that is used in the previous examples.
Imports System Imports System.Collections.ObjectModel Imports System.ComponentModel ' LibraryItem implements INotifyPropertyChanged so that the ' application is notified when a property changes. It ' implements IEditableObject so that pending changes can be discarded. Public Class LibraryItem Implements INotifyPropertyChanged Implements IEditableObject Private Structure ItemData Friend Title As String Friend CallNumber As String Friend DueDate As DateTime End Structure Private copyData As ItemData Private currentData As ItemData Public Sub New(ByVal title As String, ByVal callNum As String, ByVal dueDate As DateTime) Me.Title = title Me.CallNumber = callNum Me.DueDate = dueDate End Sub Public Property Title() As String Get Return currentData.Title End Get Set(ByVal value As String) If currentData.Title <> value Then currentData.Title = value NotifyPropertyChanged("Title") End If End Set End Property Public Property CallNumber() As String Get Return currentData.CallNumber End Get Set(ByVal value As String) If currentData.CallNumber <> value Then currentData.CallNumber = value NotifyPropertyChanged("CallNumber") End If End Set End Property Public Property DueDate() As DateTime Get Return currentData.DueDate End Get Set(ByVal value As DateTime) If value <> currentData.DueDate Then currentData.DueDate = value NotifyPropertyChanged("DueDate") End If End Set End Property #Region "INotifyPropertyChanged Members" Public Event PropertyChanged As PropertyChangedEventHandler _ Implements INotifyPropertyChanged.PropertyChanged Protected Sub NotifyPropertyChanged(ByVal info As String) RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info)) End Sub #End Region #Region "IEditableObject Members" Public Overridable Sub BeginEdit() Implements IEditableObject.BeginEdit copyData = currentData End Sub Public Overridable Sub CancelEdit() Implements IEditableObject.CancelEdit currentData = copyData NotifyPropertyChanged("") End Sub Public Overridable Sub EndEdit() Implements IEditableObject.EndEdit copyData = New ItemData() End Sub #End Region End Class Public Class MusicCD Inherits LibraryItem Private Structure MusicData Friend SongNumber As Integer Friend Artist As String End Structure Private copyData As MusicData Private currentData As MusicData Public Sub New(ByVal title As String, ByVal artist As String, ByVal songNum As Integer, ByVal callNum As String, ByVal dueDate As DateTime) MyBase.New(title, callNum, dueDate) currentData.SongNumber = songNum currentData.Artist = artist End Sub Public Property Artist() As String Get Return currentData.Artist End Get Set(ByVal value As String) If value <> currentData.Artist Then currentData.Artist = value NotifyPropertyChanged("Artist") End If End Set End Property Public Property NumberOfTracks() As Integer Get Return currentData.SongNumber End Get Set(ByVal value As Integer) If value <> currentData.SongNumber Then currentData.SongNumber = value NotifyPropertyChanged("NumberOfTracks") End If End Set End Property Public Overloads Overrides Sub BeginEdit() MyBase.BeginEdit() copyData = currentData End Sub Public Overloads Overrides Sub CancelEdit() MyBase.CancelEdit() currentData = copyData End Sub Public Overloads Overrides Sub EndEdit() MyBase.EndEdit() copyData = New MusicData() End Sub End Class Public Class Book Inherits LibraryItem Private Structure BookData Friend Author As String Friend Genre As String End Structure Private currentData As BookData Private copyData As BookData Public Sub New(ByVal title As String, ByVal author As String, ByVal genre As String, ByVal callnum As String, ByVal dueDate As DateTime) MyBase.New(title, callnum, dueDate) Me.Author = author Me.Genre = genre End Sub Public Property Author() As String Get Return currentData.Author End Get Set(ByVal value As String) If value <> currentData.Author Then currentData.Author = value NotifyPropertyChanged("Author") End If End Set End Property Public Property Genre() As String Get Return currentData.Genre End Get Set(ByVal value As String) If value <> currentData.Genre Then currentData.Genre = value NotifyPropertyChanged("Genre") End If End Set End Property Public Overloads Overrides Sub BeginEdit() MyBase.BeginEdit() copyData = currentData End Sub Public Overloads Overrides Sub CancelEdit() MyBase.CancelEdit() currentData = copyData End Sub Public Overloads Overrides Sub EndEdit() MyBase.EndEdit() copyData = New BookData() End Sub End Class Public Class MovieDVD Inherits LibraryItem Private Structure MovieData Friend Length As TimeSpan Friend Director As String Friend Genre As String End Structure Private currentData As MovieData Private copyData As MovieData Public Sub New(ByVal title As String, ByVal director As String, ByVal genre As String, ByVal length As TimeSpan, ByVal callnum As String, ByVal dueDate As DateTime) MyBase.New(title, callnum, dueDate) Me.Director = director Me.Length = length Me.Genre = genre End Sub Public Property Length() As TimeSpan Get Return currentData.Length End Get Set(ByVal value As TimeSpan) If value <> currentData.Length Then currentData.Length = value NotifyPropertyChanged("Length") End If End Set End Property Public Property Director() As String Get Return currentData.Director End Get Set(ByVal value As String) If value <> currentData.Director Then currentData.Director = value NotifyPropertyChanged("Director") End If End Set End Property Public Property Genre() As String Get Return currentData.Genre End Get Set(ByVal value As String) If value <> currentData.Genre Then currentData.Genre = value NotifyPropertyChanged("Genre") End If End Set End Property Public Overloads Overrides Sub BeginEdit() MyBase.BeginEdit() copyData = currentData End Sub Public Overloads Overrides Sub CancelEdit() MyBase.CancelEdit() currentData = copyData End Sub Public Overloads Overrides Sub EndEdit() MyBase.EndEdit() copyData = New MovieData() End Sub End Class Public Class LibraryCatalog Inherits ObservableCollection(Of LibraryItem) Public Sub New() Add(New MusicCD("A Programmers Plight", "Jon Orton", 12, "CD.OrtPro", New DateTime(2010, 3, 24))) Add(New Book("Cooking with Thyme", "Eliot J. Graff", "Home Economics", "HE.GraThy", New DateTime(2010, 2, 26))) Add(New MovieDVD("Terror of the Testers", "Molly Dempsey", "Horror", New TimeSpan(1, 27, 19), "DVD.DemTer", New DateTime(2010, 2, 1))) Add(New MusicCD("The Best of Jim Hance", "Jim Hance", 15, "CD.HanBes", New DateTime(2010, 1, 31))) Add(New Book("Victor and the VB Vehicle", "Tommy Hortono", "YA Fiction", "YA.HorVic", New DateTime(2010, 3, 1))) End Sub End Class
Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2
The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

