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

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

2024.08.03
XML
カテゴリ: WPFC#.NET


C#のWPFアプリケーションにおいて、MVVMパターンを使用する際によく利用されるデータバインディング機能について解説します。データバインディングは、View(UI)とViewModel(データやビジネスロジックの持つオブジェクト)を結びつける重要な機能です。以下に、一般的に使用されるデータバインディング機能とその解説を示します。


### 1. 基本的なバインディング




最も基本的なバインディングです。例えば、ViewModelのプロパティをTextBoxにバインドする場合です。


```xml

<TextBox Text="{Binding DataValue, UpdateSourceTrigger=PropertyChanged}" />

```


```csharp

public class MainViewModel : INotifyPropertyChanged

{

    private string _dataValue;

    public string DataValue

    {

        get => _dataValue;

        set

        {

            _dataValue = value;

            OnPropertyChanged();

        }

    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)

    {

        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }

}

```


### 2. TwoWayバインディング


`TwoWay`バインディングは、UIの変更がViewModelに反映され、ViewModelの変更がUIに反映されるバインディングモードです。


```xml

<TextBox Text="{Binding DataValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

```


### 3. コレクションバインディング


リストやコレクションをバインドする場合に使用されます。`ObservableCollection`を使用すると、アイテムの追加や削除がUIに自動的に反映されます。


```csharp

public class MainViewModel : INotifyPropertyChanged

{

    private ObservableCollection<string> _items;

    public ObservableCollection<string> Items

    {

        get => _items;

        set

        {

            _items = value;

            OnPropertyChanged();

        }

    }


    public MainViewModel()

    {

        Items = new ObservableCollection<string> { "Item1", "Item2", "Item3" };

    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)

    {

        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }

}

```


```xml

<ListBox ItemsSource="{Binding Items}" />

```


### 4. DataContextの設定


DataContextは、バインディングのソースオブジェクトを指定します。通常、ViewModelをDataContextに設定します。


```xml

<Window.DataContext>

    <vm:MainViewModel />

</Window.DataContext>

```


### 5. コマンドバインディング


ボタンのクリックイベントなどをViewModelのコマンドにバインドします。`ICommand`インターフェースを実装する必要があります。


```csharp

public class RelayCommand : ICommand

{

    private readonly Action<object> _execute;

    private readonly Func<object, bool> _canExecute;


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

    {

        _execute = execute;

        _canExecute = canExecute;

    }


    public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);

    public void Execute(object parameter) => _execute(parameter);

    public event EventHandler CanExecuteChanged

    {

        add { CommandManager.RequerySuggested += value; }

        remove { CommandManager.RequerySuggested -= value; }

    }

}

```


```csharp

public class MainViewModel : INotifyPropertyChanged

{

    public ICommand MyCommand { get; }


    public MainViewModel()

    {

        MyCommand = new RelayCommand(ExecuteMyCommand, CanExecuteMyCommand);

    }


    private void ExecuteMyCommand(object parameter)

    {

        // コマンドのロジックを実装

    }


    private bool CanExecuteMyCommand(object parameter)

    {

        // コマンドの実行可否を判定

        return true;

    }


    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)

    {

        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    }

}

```


```xml

<Button Content="Click Me" Command="{Binding MyCommand}" />

```


### 6. コンバーターの使用


バインディングの値を変換するために、コンバーターを使用します。コンバーターは`IValueConverter`インターフェースを実装する必要があります。


```csharp

public class BoolToVisibilityConverter : IValueConverter

{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)

    {

        if (value is bool boolean)

        {

            return boolean ? Visibility.Visible : Visibility.Collapsed;

        }

        return Visibility.Collapsed;

    }


    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)

    {

        throw new NotImplementedException();

    }

}

```


```xml

<Window.Resources>

    <local:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />

</Window.Resources>


<TextBlock Text="Hello, World!" Visibility="{Binding IsVisible, Converter={StaticResource BoolToVisibilityConverter}}" />

```


### まとめ


以上が、C#のWPFアプリケーションでMVVMパターンを使用する際によく利用されるデータバインディング機能の概要です。これらの機能を組み合わせることで、強力で拡張性のあるアプリケーションを構築できます。






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

Last updated  2024.08.03 11:10:51


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

© Rakuten Group, Inc.
X
Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: