WPF - Невозможно установить выпадающий список selectedIndex при изменении источника - PullRequest
0 голосов
/ 01 августа 2011

У меня есть выпадающий список, который показывает список предметов.Список отображаемых элементов определяется набором переключателей.Я прикрепляю к переключателю нажатые события и пытаюсь установить новый источник элементов в выпадающем списке.Я хотел бы, чтобы selectedItem по умолчанию равнялся 0, а не -1. ​​

Что я делаю не так?

<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));
        }
    }
}

Ответы [ 3 ]

1 голос
/ 01 августа 2011

У вас нет привязки данных к ComboBoxViewModel модели представления в вашем XAML, по крайней мере, предоставленной. Я думаю, что это проблема.

0 голосов
/ 01 августа 2011

Согласен с Тиграном. Вам необходимо назначить ComboBoxViewModel в качестве DataContext окна / страницы / элемента управления, независимо от того, что это такое, и вам необходимо связать SelectedIndex в объявлении ComboBox в xaml. Поскольку вам необходимо выполнить привязку, вам также следует переместить коллекции списков в одну ViewModel с помощью SelectedIndex и связать ComSBox ItemsSource со свойством в вашей ViewModel, которое можно установить при определенных условиях.

0 голосов
/ 01 августа 2011

Вам необходимо привязать ваш комбинированный список к вашей виртуальной машине.

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; на саму виртуальную машину.

...