0

アイテムのリストを表示するコンボボックスがあります。表示されるアイテムのリストは、ラジオボタンのセットによって決定されます。ラジオボタンのクリックされたイベントにアタッチし、コンボボックスに新しいアイテムソースを設定しようとします。selectedItemをデフォルトで-1ではなく0にしたいと思います。

私は何が間違っているのですか?

<Grid>
    <ComboBox Name="cb_Test" />
    <RadioButton Content="List 1" Name="radioButton1" Click="radioButton1_Click" />
    <RadioButton Content="List 2" Name="radioButton2" Click="radioButton2_Click" />
</Grid>
public partial class MainWindow : Window
{
    List<string> list1 = new List<string>() { "list 1", "list 1", "list 1" };
    List<string> list2 = new List<string>() { "list 2", "list 2", "list 2" };
    ComboBoxViewModel viewModel = new ComboBoxViewModel();

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = viewModel;
        cb_Test.ItemsSource = list1;
    }

    private void radioButton1_Click(object sender, RoutedEventArgs e)
    {
        cb_Test.ItemsSource = list1;
        viewModel.SelectedIndex = 0;
    }

    private void radioButton2_Click(object sender, RoutedEventArgs e)
    {
        cb_Test.ItemsSource = list2;
        viewModel.SelectedIndex = 0;
    }
}

public class ComboBoxViewModel : INotifyPropertyChanged
{
    private int selectedIndex;
    public event PropertyChangedEventHandler PropertyChanged;

    public int SelectedIndex
    {
        get { return selectedIndex; }
        set
        {
            if (selectedIndex != value)
            {
                selectedIndex = value;
                NotifyPropertyChanged("SelectedIndex");
            }
        }
    }

    private void NotifyPropertyChanged(string controlName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(controlName));
        }
    }
}
4

3 に答える 3

1

XAMLでモデルを表示するためのデータバインディングはありませんComboBoxViewModel 。少なくとも1つは提供されています。それが問題だと思います。

于 2011-08-01T19:36:18.543 に答える
0

コンボボックスをVMにバインドする必要があります。

public partial class MainWindow : Window
{
    List<string> list1 = new List<string>() { "list 1", "list 1", "list 1" };
    List<string> list2 = new List<string>() { "list 2", "list 2", "list 2" };
    ComboBoxViewModel viewModel = new ComboBoxViewModel();

    public MainWindow()
    {
        InitializeComponent();
        cb_Test.DataContext = viewModel;
    }

    private void radioButton1_Click(object sender, RoutedEventArgs e)
    {
        viewModel.ItemsSource = list1;
        viewModel.SelectedIndex = 0;
    }

    private void radioButton2_Click(object sender, RoutedEventArgs e)
    {
        viewModel.ItemsSource = list2;
        viewModel.SelectedIndex = 0;
    }
}

およびXAMLで

<Grid>
    <ComboBox Name="cb_Test"
              ItemsSource="{Binding ItemsSourse}"
              SelectedIndex="{Binding SelectedIndex}"/>
    <RadioButton Content="List 1" Name="radioButton1" Click="radioButton1_Click" />
    <RadioButton Content="List 2" Name="radioButton2" Click="radioButton2_Click" />
</Grid>

さらに優れた設計は、コードviewModel.ItemsSource = list1; viewModel.SelectedIndex = 0;をVM自体に移動することです。

于 2011-08-01T19:37:37.233 に答える
0

Tigranに同意します。ComboBoxViewModelをWindow/Page / ControlのDataContextとして割り当てる必要があります。また、xamlのComboBoxの宣言でSelectedIndexをバインドする必要があります。バインドする必要があるため、ListコレクションをSelectedIndexを使用して1つのViewModelに移動し、ComboBoxItemsSourceを特定の条件下で設定できるViewModelのプロパティにバインドする必要があります。

于 2011-08-01T19:38:19.457 に答える