IEditableCollectionViewAddNewItem 介面

定義

定義 CollectionView 實作的方法和屬性,以指定加入特定型別的項目。

public interface class IEditableCollectionViewAddNewItem : System::ComponentModel::IEditableCollectionView
public interface IEditableCollectionViewAddNewItem : System.ComponentModel.IEditableCollectionView
type IEditableCollectionViewAddNewItem = interface
    interface IEditableCollectionView
Public Interface IEditableCollectionViewAddNewItem
Implements IEditableCollectionView
衍生
實作

範例

下列範例可讓使用者將不同類型的專案新增至集合。 用戶可以輸入新專案,並提交專案或取消交易。 此範例會從 ItemsListBox 屬性取得 IEditableCollectionViewAddNewItem ,並建立物件,其類型是由用戶決定。 然後,此範例會 AddNewItem 呼叫 方法,將 物件新增至集合。

using System;
using System.ComponentModel;
using System.Windows;

namespace IEditableCollectionViewAddItemExample
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            IEditableCollectionViewAddNewItem viewToAddDisparateItems =
                catalogList.Items as IEditableCollectionViewAddNewItem;

            if (!viewToAddDisparateItems.CanAddNewItem)
            {
                MessageBox.Show("You cannot add items to the list.");
                return;
            }

            // Create a window that prompts the user to enter a new
            // item to sell.
            AddItemWindow win = new AddItemWindow();

            // Create an item, depending on which RadioButton is selected.
            // Radio buttons correspond to book, cd, dvd, or other.
            LibraryItem newItem;

            if ((bool)book.IsChecked)
            {
                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));
            }
            else if ((bool)cd.IsChecked)
            {
                newItem = new MusicCD("Enter the Album", "Enter the artist", 0, "CD.******",
                    DateTime.Now + new TimeSpan(14, 0, 0, 0));
            }

            else if ((bool)dvd.IsChecked)
            {
                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));
            }

            // 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 ((bool)win.ShowDialog())
            {
                viewToAddDisparateItems.CommitNew();
            }
            else
            {
                viewToAddDisparateItems.CancelNew();
            }
        }
    }
}
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

下列範例會建立上一個範例的用戶介面。

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

下列範例會 AddItemWindow 建立使用者在其中新增新項目資料的 。

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

下列範例顯示的 AddItemWindow邏輯。

using System.Windows;
using System.Windows.Controls;

namespace IEditableCollectionViewAddItemExample
{
    public partial class AddItemWindow : Window
    {
        public AddItemWindow()
        {
            InitializeComponent();
        }

        private void Submit_Click(object sender, RoutedEventArgs e)
        {
            DialogResult = true;
            Close();
        }

        // Select all text when the TextBox gets focus.
        private void TextBoxFocus(object sender, RoutedEventArgs e)
        {
            TextBox tbx = sender as TextBox;

            tbx.SelectAll();
        }
    }
}
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

下列範例顯示先前範例中使用的數據類型和集合。

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;

namespace IEditableCollectionViewAddItemExample
{
    // 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 : INotifyPropertyChanged, IEditableObject
    {
        struct ItemData
        {
            internal string Title;
            internal string CallNumber;
            internal DateTime DueDate;
        }

        ItemData copyData;
        ItemData currentData;

        public LibraryItem(string title, string callNum, DateTime dueDate)
        {
            Title = title;
            CallNumber = callNum;
            DueDate = dueDate;
        }

        public override string ToString()
        {
            return String.Format("{0}, {1:c}, {2:D}", Title, CallNumber, DueDate);
        }

        public string Title
        {
            get { return currentData.Title; }
            set
            {
                if (currentData.Title != value)
                {
                    currentData.Title = value;
                    NotifyPropertyChanged("Title");
                }
            }
        }

        public string CallNumber
        {
            get { return currentData.CallNumber; }
            set
            {
                if (currentData.CallNumber != value)
                {
                    currentData.CallNumber = value;
                    NotifyPropertyChanged("CallNumber");
                }
            }
        }

        public DateTime DueDate
        {
            get { return currentData.DueDate; }
            set
            {
                if (value != currentData.DueDate)
                {
                    currentData.DueDate = value;
                    NotifyPropertyChanged("DueDate");
                }
            }
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        protected void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        #endregion

        #region IEditableObject Members

        public virtual void BeginEdit()
        {
            copyData = currentData;
        }

        public virtual void CancelEdit()
        {
            currentData = copyData;
            NotifyPropertyChanged("");
        }

        public virtual void EndEdit()
        {
            copyData = new ItemData();
        }

        #endregion

    }

    public class MusicCD : LibraryItem
    {
        private struct MusicData
        {
            internal int SongNumber;
            internal string Artist;
        }

        MusicData copyData;
        MusicData currentData;

        public MusicCD(string title, string artist, int songNum, string callNum, DateTime dueDate)
            : base(title, callNum, dueDate)
        {
            currentData.SongNumber = songNum;
            currentData.Artist = artist;
        }

        public string Artist
        {
            get { return currentData.Artist; }
            set
            {
                if (value != currentData.Artist)
                {
                    currentData.Artist = value;
                    NotifyPropertyChanged("Artist");
                }
            }
        }

        public int NumberOfTracks
        {
            get { return currentData.SongNumber; }
            set
            {
                if (value != currentData.SongNumber)
                {
                    currentData.SongNumber = value;
                    NotifyPropertyChanged("NumberOfTracks");
                }
            }
        }

        public override void BeginEdit()
        {
            base.BeginEdit();
            copyData = currentData;
        }

        public override void CancelEdit()
        {
            base.CancelEdit();
            currentData = copyData;
        }

        public override void EndEdit()
        {
            base.EndEdit();
            copyData = new MusicData();
        }

        public override string ToString()
        {
            return string.Format(
                "Album: {0}\nArtist: {1}\nTracks: {2}\nDue Date: {3:d}\nCall Number: {4}",
                this.Title, this.Artist, this.NumberOfTracks, this.DueDate, this.CallNumber);
        }
    }

    public class Book : LibraryItem
    {
        private struct BookData
        {
            internal string Author;
            internal string Genre;
        }

        BookData currentData;
        BookData copyData;

        public Book(string title, string author, string genre, string callnum, DateTime dueDate)
            : base (title, callnum, dueDate)
        {
            this.Author = author;
            this.Genre = genre;
        }

        public string Author
        {
            get { return currentData.Author; }
            set
            {
                if (value != currentData.Author)
                {
                    currentData.Author = value;
                    NotifyPropertyChanged("Author");
                }
            }
        }

        public string Genre
        {
            get { return currentData.Genre; }
            set
            {
                if (value != currentData.Genre)
                {
                    currentData.Genre = value;
                    NotifyPropertyChanged("Genre");
                }
            }
        }

        public override void BeginEdit()
        {
            base.BeginEdit();
            copyData = currentData;
        }

        public override void CancelEdit()
        {
            base.CancelEdit();
            currentData = copyData;
        }

        public override void EndEdit()
        {
            base.EndEdit();
            copyData = new BookData();
        }

        public override string ToString()
        {
            return String.Format(
                "Title: {0}\nAuthor: {1}\nGenre: {2}\nDue Date: {3:d}\nCall Number: {4}",
                this.Title, this.Author, this.Genre, this.DueDate, this.CallNumber);
        }
    }

    public class MovieDVD : LibraryItem
    {
        private struct MovieData
        {
            internal TimeSpan Length;
            internal string Director;
            internal string Genre;
        }

        private MovieData currentData;
        private MovieData copyData;

        public MovieDVD(string title, string director, string genre, TimeSpan length, string callnum, DateTime dueDate)
            : base(title, callnum, dueDate)
        {
            this.Director = director;
            this.Length = length;
            this.Genre = genre;
        }

        public TimeSpan Length
        {
            get { return currentData.Length; }
            set
            {
                if (value != currentData.Length)
                {
                    currentData.Length = value;
                    NotifyPropertyChanged("Length");
                }
            }
        }

        public string Director
        {
            get { return currentData.Director; }
            set
            {
                if (value != currentData.Director)
                {
                    currentData.Director = value;
                    NotifyPropertyChanged("Director");
                }
            }
        }

        public string Genre
        {
            get { return currentData.Genre; }
            set
            {
                if (value != currentData.Genre)
                {
                    currentData.Genre = value;
                    NotifyPropertyChanged("Genre");
                }
            }
        }

        public override void BeginEdit()
        {
            base.BeginEdit();
            copyData = currentData;
        }

        public override void CancelEdit()
        {
            base.CancelEdit();
            currentData = copyData;
        }

        public override void EndEdit()
        {
            base.EndEdit();
            copyData = new MovieData();
        }

        public override string  ToString()
        {
            return String.Format("Title: {0}\nDirector: {1}\nGenre: {2}\nLength: {3}\nDue Date: {4:d}\nCall Number: {5}",
                this.Title, this.Director, this.Genre, this.Length, this.DueDate, this.CallNumber);
        }
    }

    public class LibraryCatalog : ObservableCollection<LibraryItem>
    {
        public LibraryCatalog()
        {
            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)));
        }
    }
}
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

備註

介面 IEditableCollectionViewAddNewItem 可讓應用程式開發人員指定要新增至集合的物件類型。 此介面會 IEditableCollectionView擴充 ,因此您可以新增、編輯和移除集合中的專案。 IEditableCollectionViewAddNewItemAddNewItem會加入方法,這個方法會接受加入至集合的物件。 當您想要加入的集合和物件具有下列一或多個特性時,這個方法很有用:

  • 中的 CollectionView 物件是不同類型的。

  • 對象沒有無參數建構函式。

  • 物件已存在。

  • 您要將物件新增 null 至集合。

屬性

CanAddNew

取得值,這個值表示新項目是否可以加入至此集合。

(繼承來源 IEditableCollectionView)
CanAddNewItem

取得值,這個值表示指定的物件是否可以加入至此集合。

CanCancelEdit

取得值,這個值表示集合檢視是否可以捨棄暫止的變更,並還原已編輯物件的原始值。

(繼承來源 IEditableCollectionView)
CanRemove

取得值,這個值表示是否可以從集合中移除某個項目。

(繼承來源 IEditableCollectionView)
CurrentAddItem

取得要在目前加入異動期間加入的項目。

(繼承來源 IEditableCollectionView)
CurrentEditItem

取得集合內將被編輯的項目。

(繼承來源 IEditableCollectionView)
IsAddingNew

取得值,這個值表示加入異動是否正在進行中。

(繼承來源 IEditableCollectionView)
IsEditingItem

取得值,這個值表示編輯異動是否正在進行中。

(繼承來源 IEditableCollectionView)
NewItemPlaceholderPosition

取得或設定集合檢視中新項目預留位置 (Placeholder) 的位置 (Position)。

(繼承來源 IEditableCollectionView)

方法

AddNew()

將新項目加入至集合中。

(繼承來源 IEditableCollectionView)
AddNewItem(Object)

將指定的物件加入至集合。

CancelEdit()

結束編輯異動,並在可能情況下還原項目的原始值。

(繼承來源 IEditableCollectionView)
CancelNew()

結束加入異動並捨棄暫止的新項目。

(繼承來源 IEditableCollectionView)
CommitEdit()

結束編輯異動並儲存暫止的變更。

(繼承來源 IEditableCollectionView)
CommitNew()

結束加入異動並儲存暫止的新項目。

(繼承來源 IEditableCollectionView)
EditItem(Object)

開始所指定項目的編輯異動。

(繼承來源 IEditableCollectionView)
Remove(Object)

從集合中移除指定的項目。

(繼承來源 IEditableCollectionView)
RemoveAt(Int32)

從集合中移除位於指定之位置的項目。

(繼承來源 IEditableCollectionView)

適用於