WPFにおけるリストデータの追加・更新・削除実装

要件と実装ポイント

リストデータの操作機能を実装する場合、以下の要件を満たす必要があります:

  • テキスト入力フィールドからデータを追加
  • 選択項目の内容を更新
  • 選択項目の削除

主要な実装要素

  • DisplayMemberPathによるプロパティ表示指定
  • ObservableCollectionによる自動更新通知
  • INotifyPropertyChangedインターフェースの実装
  • ItemsSourceプロパティによるデータバインディング

XAML実装例

<Window x:Class="ListOperations.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="リスト操作" Height="350" Width="500">
    <StackPanel Margin="10">
        <TextBox Name="inputField" Margin="0,0,0,10"/>
        <StackPanel Orientation="Horizontal">
            <Button Name="addButton" Content="追加" Click="AddItem" Margin="0,0,5,0"/>
            <Button Name="updateButton" Content="更新" Click="UpdateItem" Margin="5,0,5,0"/>
            <Button Name="deleteButton" Content="削除" Click="RemoveItem"/>
        </StackPanel>
        <ListBox Name="itemList" DisplayMemberPath="DisplayValue" Height="150" Margin="0,10,0,0"/>
    </StackPanel>
</Window>

C#実装例

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

namespace ListOperations
{
    public partial class MainView : Window
    {
        private ObservableCollection<ListItem> items = new ObservableCollection<ListItem>();

        public MainView()
        {
            InitializeComponent();
            InitializeData();
        }

        private void InitializeData()
        {
            items.Add(new ListItem { DisplayValue = "項目1" });
            items.Add(new ListItem { DisplayValue = "項目2" });
            items.Add(new ListItem { DisplayValue = "項目3" });
            itemList.ItemsSource = items;
        }

        private void AddItem(object sender, RoutedEventArgs e)
        {
            if (!string.IsNullOrEmpty(inputField.Text))
            {
                items.Add(new ListItem { DisplayValue = inputField.Text });
            }
        }

        private void UpdateItem(object sender, RoutedEventArgs e)
        {
            if (itemList.SelectedItem != null)
            {
                (itemList.SelectedItem as ListItem).DisplayValue = inputField.Text;
            }
        }

        private void RemoveItem(object sender, RoutedEventArgs e)
        {
            if (itemList.SelectedItem != null)
            {
                items.Remove(itemList.SelectedItem as ListItem);
            }
        }
    }

    public class ListItem : INotifyPropertyChanged
    {
        private string displayContent;
        public string DisplayValue
        {
            get => displayContent;
            set
            {
                displayContent = value;
                OnPropertyChanged(nameof(DisplayValue));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

動作説明

この実装では以下の動作特性があります:

  • ObservableCollectionを使用することで、項目追加/削除時にUIが自動更新
  • INotifyPropertyChangedにより項目値変更時に表示が即時反映
  • DisplayMemberPathで表示プロパティを直接指定

タグ: WPF ObservableCollection INotifyPropertyChanged データバインディング

5月31日 22:09 投稿