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

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

2024.08.04
XML
カテゴリ: WPFC#.NET


C# WPF の MVVM パターンで `Boolean` 型を `Visibility` に変換するサンプルコードを以下に示します。この例では、`BooleanToVisibilityConverter` を使用して、`Boolean` 値を `Visibility` に変換します。


## プロジェクトの設定



   Visual Studio で新しい WPF アプリケーションプロジェクトを作成します。


2. **コンバーター クラスの追加**:

   `Boolean` 型を `Visibility` に変換するためのコンバーター クラスを追加します。


### コンバーター クラス


まず、`IValueConverter` インターフェイスを実装したコンバーター クラスを作成します。


```csharp

using System;

using System.Globalization;

using System.Windows;

using System.Windows.Data;


public class BooleanToVisibilityConverter : IValueConverter

{

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

    {

        if (value is bool boolValue)

        {

            return boolValue ? Visibility.Visible : Visibility.Collapsed;

        }

        return Visibility.Collapsed;

    }


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

    {

        if (value is Visibility visibility)

        {

            return visibility == Visibility.Visible;

        }

        return false;

    }

}

```


### ビュー モデル (ViewModel)


次に、`Boolean` プロパティを持つビュー モデルを作成します。


```csharp

using System.ComponentModel;

using System.Runtime.CompilerServices;


public class MainViewModel : INotifyPropertyChanged

{

    private bool _isVisible;


    public bool IsVisible

    {

        get => _isVisible;

        set

        {

            _isVisible = value;

            OnPropertyChanged();

        }

    }


    public MainViewModel()

    {

        // 初期値を設定

        IsVisible = true;

    }


    public event PropertyChangedEventHandler PropertyChanged;

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

    {

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

    }

}

```


### ビュー (View)


コンバーターをリソースとして追加し、`Boolean` プロパティを `Visibility` にバインドする XAML を作成します。


`MainWindow.xaml`:


```xml

<Window x:Class="WpfApp.MainWindow"

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

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

        Title="MainWindow" Height="200" Width="400">

    <Window.Resources>

        <local:BooleanToVisibilityConverter x:Key="BoolToVisConverter" />

    </Window.Resources>

    <Grid>

        <StackPanel>

            <Button Content="Toggle Visibility"

                    Command="{Binding ToggleVisibilityCommand}" 

                    Width="200" Height="30" Margin="10" />

            <TextBlock Text="This is a text block"

                       Visibility="{Binding IsVisible, Converter={StaticResource BoolToVisConverter}}"

                       Width="200" Height="30" Margin="10" />

        </StackPanel>

    </Grid>

</Window>

```


### ビュー コードビハインド (View Code-Behind)


最後に、ビューのコードビハインドファイルでデータコンテキストを設定します。


`MainWindow.xaml.cs`:


```csharp

using System.Windows;


namespace WpfApp

{

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

            DataContext = new MainViewModel();

        }

    }

}

```


### コマンド (RelayCommand)


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

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

    }

}

```


### ビュー モデル (ViewModel) の更新


ビュー モデルに `RelayCommand` を使用して、ボタンのクリックで `IsVisible` プロパティをトグルするコマンドを追加します。


```csharp

using System.ComponentModel;

using System.Runtime.CompilerServices;

using System.Windows.Input;


public class MainViewModel : INotifyPropertyChanged

{

    private bool _isVisible;


    public bool IsVisible

    {

        get => _isVisible;

        set

        {

            _isVisible = value;

            OnPropertyChanged();

        }

    }


    public ICommand ToggleVisibilityCommand { get; }


    public MainViewModel()

    {

        // 初期値を設定

        IsVisible = true;

        ToggleVisibilityCommand = new RelayCommand(ToggleVisibility);

    }


    private void ToggleVisibility()

    {

        IsVisible = !IsVisible;

    }


    public event PropertyChangedEventHandler PropertyChanged;

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

    {

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

    }

}

```


## コードの説明


1. **コンバーター クラス**:

   - `BooleanToVisibilityConverter` クラスは、`Boolean` 値を `Visibility` に変換します。`true` は `Visible` に、`false` は `Collapsed` に変換されます。


2. **ビュー モデル (ViewModel)**:

   - `MainViewModel` クラスは、`IsVisible` プロパティと `ToggleVisibilityCommand` コマンドを持ちます。`IsVisible` プロパティは `TextBlock` の表示/非表示を制御します。

   - `ToggleVisibility` メソッドは `IsVisible` プロパティの値をトグルします。


3. **ビュー (View)**:

   - `MainWindow.xaml` では、`BooleanToVisibilityConverter` をリソースとして追加し、`TextBlock` の `Visibility` プロパティを `IsVisible` プロパティにバインドします。

   - ボタンをクリックすると、`ToggleVisibilityCommand` が実行され、`IsVisible` プロパティの値がトグルされます。


4. **ビュー コードビハインド (View Code-Behind)**:

   - `MainWindow.xaml.cs` では、`DataContext` を `MainViewModel` に設定します。


このサンプルコードを実行すると、`TextBlock` の表示/非表示がボタンのクリックによって制御されます。`Boolean` 型の値が `Visibility` に変換され、`TextBlock` の `Visibility` プロパティにバインドされるため、`TextBlock` の表示/非表示が動的に更新されます。






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

Last updated  2024.08.04 15:24:43


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

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