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

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

2024.08.04
XML
カテゴリ: WPFC#.NET


WPFで`BooleanToVisibilityConverter`クラスを使用する際に、カルチャ情報を設定する例を示します。通常、このコンバータにはカルチャ情報を使用するシナリオはあまりないかもしれませんが、特定のカルチャに基づいて動作を変更する場合の例を考えてみましょう。


以下は、カルチャ情報に基づいて動作を変更する`BooleanToVisibilityConverter`のサンプルコードです。




まず、カルチャ情報を考慮するために`BooleanToVisibilityConverter`クラスを修正します。ここでは、カルチャが`"ja-JP"`(日本語)であれば、`true`を`Visibility.Visible`に、`false`を`Visibility.Hidden`に変換します。それ以外のカルチャでは、`true`を`Visibility.Visible`に、`false`を`Visibility.Collapsed`に変換します。


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

        {

            if (culture.Name == "ja-JP")

            {

                return boolValue ? Visibility.Visible : Visibility.Hidden;

            }

            else

            {

                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;

    }

}

```


### ビュー (View)


次に、XAMLでコンバータを使用し、カルチャ情報を設定します。`ConverterCulture`プロパティを使用してカルチャ情報を指定できます。


```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}, ConverterCulture='ja-JP'}"

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

        </StackPanel>

    </Grid>

</Window>

```


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


ビュー モデルには、`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));

    }

}

```


### コマンドクラス (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;

    }

}

```


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


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


```csharp

using System.Windows;


namespace WpfApp

{

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

            DataContext = new MainViewModel();

        }

    }

}

```


### コードの説明


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

   - `BooleanToVisibilityConverter` クラスは、`Boolean` 値を `Visibility` に変換します。カルチャが`"ja-JP"`の場合、`false` は `Visibility.Hidden` に、それ以外のカルチャでは `Visibility.Collapsed` に変換します。


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

   - `MainWindow.xaml` で、`BooleanToVisibilityConverter` をリソースとして追加し、`ConverterCulture` を指定して `Boolean` 値を `Visibility` にバインドします。


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

   - `MainViewModel` クラスは、`IsVisible` プロパティとその値をトグルする `ToggleVisibilityCommand` を持ちます。


4. **コマンドクラス (RelayCommand)**:

   - `RelayCommand` クラスは、ボタンのコマンド機能を実装するための汎用的なクラスです。


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

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


このサンプルコードを実行すると、カルチャ情報に基づいて `Boolean` 値が `Visibility` に変換され、`TextBlock` の表示/非表示が動的に変更されます。カルチャが `ja-JP` の場合、`false` は `Visibility.Hidden` になり、それ以外のカルチャでは `Visibility.Collapsed` になります。






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

Last updated  2024.08.04 15:30:06


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

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