2025年7月22日
WinUI 3 (.NET 8) でデスクトップアプリを開発していて、「セレクトボックス(ComboBox)に自作クラスをバインドしたい」「選択変更イベントを取得したい」と思ったことはありませんか?
この記事では、ComboBox に List<string> ではなく自作クラス List<T> をバインドする方法と、選択変更を検知するためのイベントハンドリング方法について、実用的なサンプルコードとともに分かりやすく解説します。
<ComboBox Header="選択してください" Width="200">
<ComboBoxItem Content="選択肢1" />
<ComboBoxItem Content="選択肢2" />
</ComboBox>
これだけでも動作しますが、実際のアプリでは List<T> のようなデータを使って動的に項目を生成したいケースが多いです。
public class MyOption
{
public int Id { get; set; }
public string Name { get; set; } // 表示に使う
}
<ComboBox
x:Name="MyComboBox"
ItemsSource="{x:Bind Options}"
SelectedItem="{x:Bind SelectedOption, Mode=TwoWay}"
DisplayMemberPath="Name"
Header="選択してください"
SelectionChanged="MyComboBox_SelectionChanged"
Width="200"/>
public sealed partial class MainWindow : Window
{
public List<MyOption> Options { get; } = new()
{
new MyOption { Id = 1, Name = "オプションA" },
new MyOption { Id = 2, Name = "オプションB" },
new MyOption { Id = 3, Name = "オプションC" }
};
public MyOption SelectedOption { get; set; }
public MainWindow()
{
this.InitializeComponent();
}
}
MyComboBox.SelectedIndex = 0; // 最初の項目を選択
SelectedOption = Options.FirstOrDefault(x => x.Id == 2);
注意: x:Bind を使っている場合は SelectedOption に代入するほうが安全です。
<ComboBox SelectionChanged="MyComboBox_SelectionChanged" />
private void MyComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (MyComboBox.SelectedItem is MyOption selected)
{
Debug.WriteLine($"選ばれた: {selected.Id} - {selected.Name}");
}
}
private MyOption _selectedOption;
public MyOption SelectedOption
{
get => _selectedOption;
set
{
if (_selectedOption != value)
{
_selectedOption = value;
// 値が変更されたときの処理
Debug.WriteLine($"選択されたオプション: {_selectedOption?.Name}");
}
}
}
| 内容 | 方法 |
|---|---|
| ComboBox に自作クラスを表示する | ItemsSource + DisplayMemberPath を使う |
| 初期選択を設定する | SelectedIndex または SelectedItem を使う |
| 値の変更を検知する | SelectionChanged イベントを使う |
| MVVMでの変更通知 | プロパティセッターで処理を記述する |
WinUI 3 / XAML の Grid.Width 設定方法
WinUI 3でMenuFlyoutをShowAtで表示する方法【コード付き解説】
MenuFlyout は WinUI 3 で便利なポップアップメニュー
WinUI 3の開発で混乱しがちな「空白のウィンドウ」と「空白のページ」の違い
PowerShellでMSIXアプリ(Storeアプリ)を起動する方法|AppUserModelIdとURIスキーム活用術
Microsoft Storeアプリ更新時のロールアウト設定まとめ
Microsoft純正の新しいコンソールエディタ「edit」が復活!| edit.exe インストール方法
Microsoft Authenticatorのオートフィル機能が2025年7月に終了
RuntimeBroker.exeとMsEdgeWebView2.exeとは?Windows 11のプロセスについて
PowerShellでGrapheme Clusterについて処理を考える
【Windows】Volta コマンドライン インストール | Node.jsをバージョン管理する方法
【C#】大容量ファイルを指定サイズ以下に分割する方法|.NET8対応コード付き
【C# .NET 8】ファイルから重複行を削除する2つの方法|Distinct vs HashSet
WinUI 3 ComboBoxの自作クラスバインドと選択イベント検出方法
System.Text.Json 9.0.0.0 で FileNotFoundException
C#で改行・カンマ入りのCSVを正しく読み込む方法【.NET8対応】
C#/.NET 8でDateTimeを日本時間でISO 8601形式に変換する方法