「東雲 忠太郎」の平凡な日常のできごと

「東雲 忠太郎」の平凡な日常のできごと

2024.03.14
XML
カテゴリ: C#.NET


以下は、C#とWPFを使用した基本的なMVVMパターンのサンプルコードです。この例では、簡単なToDoリストアプリケーションを作成します。ToDoアイテムを追加し、削除できるようにします。


まず、`ToDoItem`というクラスを作成します。これはToDoアイテムのデータを表します。


```csharp

public class ToDoItem

{

    public string Task { get; set; }

}

```


次に、ビューモデルクラスを作成します。


```csharp

using System.Collections.ObjectModel;

using System.Windows.Input;

using System.Windows;


public class MainViewModel : ViewModelBase

{

    public ObservableCollection<ToDoItem> ToDoItems { get; set; }

    public ICommand AddCommand { get; set; }

    public ICommand RemoveCommand { get; set; }

    private string _newTask;


    public string NewTask

    {

        get { return _newTask; }

        set

        {

            _newTask = value;

            OnPropertyChanged(nameof(NewTask));

        }

    }


    public MainViewModel()

    {

        ToDoItems = new ObservableCollection<ToDoItem>();

        AddCommand = new RelayCommand(AddTask);

        RemoveCommand = new RelayCommand(RemoveTask);

    }


    private void AddTask()

    {

        if (!string.IsNullOrWhiteSpace(NewTask))

        {

            ToDoItems.Add(new ToDoItem { Task = NewTask });

            NewTask = string.Empty;

        }

    }


    private void RemoveTask(object obj)

    {

        var item = obj as ToDoItem;

        if (item != null)

        {

            ToDoItems.Remove(item);

        }

    }

}

```


`ViewModelBase`は、`INotifyPropertyChanged`を実装する基本クラスです。`RelayCommand`は、`ICommand`を実装し、ビューからビューモデルのコマンドをバインディングするための便利なクラスです。これらのクラスは、通常、MVVMライブラリから取得できます。


ビューモデルクラスで使用されている`RelayCommand`の実装例は以下の通りです。


```csharp

using System;

using System.Windows.Input;


public class RelayCommand : ICommand

{

    private readonly Action _execute;

    private readonly Func<bool> _canExecute;


    public RelayCommand(Action execute, Func<bool> canExecute = null)

    {

        _execute = execute ?? throw new ArgumentNullException(nameof(execute));

        _canExecute = canExecute;

    }


    public bool CanExecute(object parameter)

    {

        return _canExecute == null || _canExecute();

    }


    public void Execute(object parameter)

    {

        _execute();

    }


    public event EventHandler CanExecuteChanged

    {

        add { CommandManager.RequerySuggested += value; }

        remove { CommandManager.RequerySuggested -= value; }

    }

}

```


最後に、XAMLファイルでビューを作成します。


```xml

<Window x:Class="ToDoList.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:ToDoList"

        mc:Ignorable="d"

        Title="ToDo List" Height="450" Width="800">

    <Window.DataContext>

        <local:MainViewModel/>

    </Window.DataContext>

    <Grid>

        <Grid.RowDefinitions>

            <RowDefinition Height="Auto"/>

            <RowDefinition Height="*"/>

        </Grid.RowDefinitions>

        <StackPanel Grid.Row="0" Orientation="Horizontal">

            <TextBox Width="200" Margin="5" Text="{Binding NewTask, UpdateSourceTrigger=PropertyChanged}"/>

            <Button Width="80" Margin="5" Content="Add" Command="{Binding AddCommand}"/>

        </StackPanel>

        <ListBox Grid.Row="1" ItemsSource="{Binding ToDoItems}" DisplayMemberPath="Task">

            <ListBox.ItemTemplate>

                <DataTemplate>

                    <StackPanel Orientation="Horizontal">

                        <TextBlock Text="{Binding Task}"/>

                        <Button Content="Remove" Command="{Binding DataContext.RemoveCommand, RelativeSource={RelativeSource AncestorType=ListBox}}" CommandParameter="{Binding}"/>

                    </StackPanel>

                </DataTemplate>

            </ListBox.ItemTemplate>

        </ListBox>

    </Grid>

</Window>

```


これで、基本的なMVVMパターンを使用したToDoリストアプリケーションが完成しました。ビューはXAMLで定義され、ビューモデルはコードビハインドから分離されます。ビューとビューモデルは、データバインディングとコマンドバインディングを使用して相互に通信します。






お気に入りの記事を「いいね!」で応援しよう

Last updated  2024.03.14 03:53:03


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

© Rakuten Group, Inc.
Create a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: