

`ComboBox`をC#側で作成するとき、`SelectedIndex`プロパティの設定方法がわかりません。  
どのようなメソッドを使えばよいのでしょうか？

以下のxamlを例に、回答をお願いします。

[code]

    <ComboBox Name="newCombo"
                SelectedIndex="{
    　　　　　　　　Binding someData, 
    　　　　　　　　Mode=TwoWay, 
    　　　　　　　　UpdateSourceTrigger=PropertyChanged}">
        <ComboBoxItem>A</ComboBoxItem>
        <ComboBoxItem>B</ComboBoxItem>
    </ComboBox>
    
[/code]

現在、自分がこれまで考えたC#のコードは、以下となります。

[code]

    var cmb = 
        new ComboBox() {
            Name = "newCombo",
            SelectedIndex = someData,
        };
    
    var binding = 
        new Binding
        {
            Mode = BindingMode.TwoWay,
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
        };
    
    // ここから自分はわかりません。
    // cmbに、何からの方法でbindingを組み込むのか、
    // 或いは、別の方法か？
                
    
[/code]


CC BY-SA 4.0
2022-06-10T06:42:57.057
89312
2022-06-13T00:27:47.383
52993
question
c# wpf xaml
ComboBoxのSelectedIndexを、C#側で設定する方法をお願いします。


cmbにSetBindingでbindingを組み込むことができます。  
例: `cmb.SetBinding(ComboBox.SelectedIndexProperty, binding);`

下記のサンプルコードはWpfApp1プロジェクトで動的に作成したコンボボックスのSelectedIndexとテキストボックスのTextを連動させています。

**サンプルコード**

_MainWindow.xaml.cs_

[code]

    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    
    namespace WpfApp1
    {
        public partial class MainWindow : Window
        {
            MySelection mySelection;
            public MainWindow()
            {
                InitializeComponent();
    
                mySelection = new MySelection();
                // バインディング作成
                var binding = new Binding("SelectedIndex")
                {
                    Mode = BindingMode.TwoWay,
                    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                    Source = mySelection,
                };
                // 動的コンボボックス作成
                var cmb = new ComboBox
                {
                    Name = "newCombo",
                    ItemsSource = new List<string> { "A", "B" },
                };
    
                // ☆ バインディングをコンボボックスのSelectedInexに設定する ☆
                cmb.SetBinding(ComboBox.SelectedIndexProperty, binding);
    
                // C#側で動的に作成したコンボボックスとテキストボックスを配置
                var grid = (Content as Grid);
                grid.Children.Add(cmb);
                var text = new TextBox();
                text.SetBinding(TextBox.TextProperty, binding);
                Grid.SetColumn(text, 2);
                grid.Children.Add(text);
            }
        }
    
        /// <summary>
        /// 変更通知用クラス(C# 6.0 以降で使用可)
        /// </summary>
        public class MySelection : INotifyPropertyChanged
        {
            private int selectedIndex;
    
            public event PropertyChangedEventHandler? PropertyChanged;
            public int SelectedIndex
            {
                get { return selectedIndex; }
                set
                {
                    selectedIndex = value;
                    OnPropertyChanged("SelectedIndex");
                }
            }
    
            protected void OnPropertyChanged([CallerMemberName] string? info = null)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
            }
        }
    }
    
[/code]

_MainWindow.xaml_

[code]

    <Window x:Class="WpfApp1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="1" Text="SelectedIndexと右のテキストは連動する"/>
        </Grid>
    </Window>
    
[/code]


CC BY-SA 4.0
2022-06-10T23:58:38.713
89324
2022-06-10T23:58:38.713
9820
89312
answer