Color

日々の備忘録

WPF ComboBox に新しい ItemsSource を追加する

2023年09月12日 10時43分52秒 | Windows

◆ReactiveCollection を用いて、簡単に ComboBox に新しい ItemsSource を追加する手順

1.準備
●OS:Windows 10 Pro 64bit Version 22H2
●IDE:Visual Studio Community 2022 Version 17.7.3

2.WPFアプリケーション(Prismフレームワーク)
プロジェクトのテンプレートとして Prism Blank App(WPF) を選択して、新しいプロジェクトを作成

3.Nuget
ReactiveProperty.WPF
MaterialDesignThemes【任意】
MaterialDesignColors【任意】

4.App.xaml

    001: <prism:PrismApplication x:Class="WPFComboBoxSample.App" 002: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 003: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 004: xmlns:local="clr-namespace:WPFComboBoxSample" 005: xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes" 006: xmlns:prism="http://prismlibrary.com/" > 007: <Application.Resources> 008: <ResourceDictionary> 009: <ResourceDictionary.MergedDictionaries> 010: <md:BundledTheme 011: BaseTheme="Light" 012: PrimaryColor="DeepPurple" 013: SecondaryColor="Lime" /> 014: <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" /> 015: </ResourceDictionary.MergedDictionaries> 016: </ResourceDictionary> 017: </Application.Resources> 018: </prism:PrismApplication>

5.MainWindow.xaml

    001: <Window x:Class="WPFComboBoxSample.Views.MainWindow" 002: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 003: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 004: xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes" 005: xmlns:prism="http://prismlibrary.com/" 006: prism:ViewModelLocator.AutoWireViewModel="True" 007: Title="WPFComboBoxSample" Height="350" Width="525" > 008: <Window.Resources> 009: <Style TargetType="ComboBox" x:Key="MenuComb" 010: BasedOn="{StaticResource MaterialDesignOutlinedComboBox}" > 011: <Setter Property="Width" Value="400" /> 012: <Setter Property="Margin" Value="10,0,0,0" /> 013: <Setter Property="IsEditable" Value="True" /> 014: </Style> 015: <Style TargetType="Button" x:Key="CommandBtn" 016: BasedOn="{StaticResource MaterialDesignFlatAccentBgButton}"> 017: <Setter Property="FontSize" Value="20" /> 018: <Setter Property="Width" Value="100" /> 019: <Setter Property="Margin" Value="0,0,0,0" /> 020: <Setter Property="IsEnabled" Value="True" /> 021: </Style> 022: </Window.Resources> 023: <Grid> 024: <ContentControl prism:RegionManager.RegionName="ContentRegion" /> 025: 026: <DockPanel > 027: <ComboBox md:HintAssist.Hint="Site" md:TextFieldAssist.HasClearButton="True" 028: Style="{StaticResource MenuComb}" 029: Text="{Binding SiteText.Value}" 030: ItemsSource="{Binding SiteList}" 031: SelectedValue="{Binding SiteName.Value}" /> 032: <Button x:Name="SiteAdd" Content="Add" 033: Style="{StaticResource CommandBtn}" 034: Command="{Binding MainCommand}" 035: CommandParameter="Add" /> 036: </DockPanel> 037: </Grid> 038: </Window>

6.MainWindowViewModel.cs

    001: using Prism.Commands; 002: using Prism.Mvvm; 003: using Reactive.Bindings; 004: 005: namespace WPFComboBoxSample.ViewModels 006: { 007: public class MainWindowViewModel : BindableBase 008: { 009: // ComboBox.ItemsSource 010: public ReactiveCollection<string> SiteList { get; set; } = new ReactiveCollection<string>(); 011: // ComboBox.SelectedValue 012: public ReactiveProperty<string> SiteName { get; set; } = new ReactiveProperty<string>(); 013: // ComboBox.Text 014: public ReactiveProperty<string> SiteText { get; set; } = new ReactiveProperty<string>(); 015: // Command 016: public DelegateCommand<string> MainCommand { get; } 017: 018: public MainWindowViewModel() 019: { 020: // Command実装 021: MainCommand = new DelegateCommand<string>(ExcuteCommand); 022: // サイトアドレス初期値 023: SiteList.Add("https://www.google.com/"); 024: SiteList.Add("https://www.yahoo.co.jp/"); 025: SiteList.Add("https://chat.openai.com/auth/login"); 026: } 027: private void ExcuteCommand(string _commandParamete) 028: { 029: switch (_commandParamete) 030: { 031: case "Add": 032: AddCommand(); // 新しいサイトアドレスを追加 033: break; 034: } 035: } 036: private void AddCommand() 037: { 038: string _s = SiteText.Value; 039: if (_s != null) 040: { // 新しい行の追加 041: SiteList.Add(_s); 042: } 043: } 044: } 045: }

7.実行
サイトアドレス初期状態

新しいサイトアドレスを入力して、 Add ボタンをクリック

ComboBox のリストに新しいサイトアドレスが追加されている

─以上─