0

コード ビハインドに基づいて ComboBox をバインドしています。以下は、私の XAML とコード ビハインドです。

<Window x:Class="ComboBoxBindingDatabase.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <ComboBox Height="29" HorizontalAlignment="Left" Margin="135,60,0,0" Name="comboBox1" VerticalAlignment="Top" Width="194" IsEditable="True"/>
    <TextBox Height="39" HorizontalAlignment="Left" Margin="135,159,0,0" Name="textBox1" VerticalAlignment="Top" Width="194" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="384,165,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <TextBox Height="35" HorizontalAlignment="Left" Margin="368,0,0,172" Name="textBox2" VerticalAlignment="Bottom" Width="115" />
</Grid>

コードビハインド:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        BindComboBox(comboBox1);
    }

    ArrayList b = new ArrayList();

    public void BindComboBox(ComboBox comboBoxName)
    {

        b.Add("a");
        b.Add("b");
        b.Add("c");
        b.Add("d");
        comboBoxName.ItemsSource = b;  
        comboBoxName.DisplayMemberPath = Name;
        comboBoxName.SelectedValuePath = Name;

    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        b.Add(textBox2.Text);
        foreach (string s in b)
        {
            comboBox1.ItemsSource = b;
            comboBox1.DisplayMemberPath = Name;
            comboBox1.SelectedValuePath = Name;
        }

    }

}

そのため、最初にプロジェクトを実行すると、ComcoBox に a、b、cd がドロップダウン リストとして表示されます。しかし、テキストボックスに新しい文字を入力してボタンをクリックすると、ArrayList b が新しい文字をリストに追加し、コンボボックスを再バインドしようとしていますが、機能しません。ArrarList b がインクリメントするのを見たと思った a、b、c、d がまだ表示されています。

ComboBox が再バインドされないのはなぜですか? 単純に item.add メソッドではなく、Code Behind に基づいて ComboBox に要素を動的に追加する方法はありますか。

前もって感謝します。

4

2 に答える 2

2

代わりに ObservableCollection を使用する必要があります。新しいアイテムが追加されてコンボボックスが更新されるたびにコレクションが変更通知をトリガーする場合でも、ボタンクリック内で再度バインドする必要はありません。

  ObservableCollection<string> b= new ObservableCollection<string>();

  public void BindComboBox(ComboBox comboBoxName)
    {

        b.Add("a");
        b.Add("b");
        b.Add("c");
        b.Add("d");

        comboBoxName.ItemsSource = b;  


    }


 private void button1_Click(object sender, RoutedEventArgs e)
    {
        b.Add(textBox2.Text);

    }
于 2013-01-30T23:12:35.427 に答える
0

WPF では、コード ビハインドで UIControls を直接参照することは悪い習慣です。コントロールはデータにバインドする必要があり、データを変更すると UI が更新される必要があります。

これは、UIControls への参照を大幅に減らして何をしようとしているのかを示す小さな例です。

Xaml:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="233" Width="405" Name="UI">
    <Grid DataContext="{Binding ElementName=UI}">
        <StackPanel>
            <ComboBox ItemsSource="{Binding MyList}" Name="comboBox1" IsEditable="True"/>
            <TextBox x:Name="textbox1" />
            <Button Content="Button" Tag="{Binding ElementName=textbox1, Path=Text}" Name="button1" Click="button1_Click" />
        </StackPanel>
    </Grid>
</Window>

コード:

  public partial class MainWindow : Window
    {
        private ObservableCollection<string> _myList = new ObservableCollection<string>();

        public MainWindow()
        {
            InitializeComponent();
            MyList.Add("a");
            MyList.Add("b");
            MyList.Add("c");
            MyList.Add("d");
        }

        public ObservableCollection<string> MyList
        {
            get { return _myList; }
            set { _myList = value; }
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MyList.Add((sender as Button).Tag.ToString());
        }
     }
于 2013-01-30T23:13:50.203 に答える