Обновление связывания данных WPF comboxbox2 на основе изменения выбора в combobox1 с MVVM - PullRequest
3 голосов
/ 20 мая 2010

У меня есть поле со списком, которое я привязал к списку, который существует в моей модели представления. Теперь, когда пользователи делают выбор в этом поле со списком, я хочу, чтобы второе поле со списком обновило его содержимое.

Так, например, combobox1 - это состояния, а combobox2 должен содержать только Zip-коды этого состояния.

Но в моем случае у меня нет заранее определенных списков для combobox2, мне нужно получить данные из базы данных.

Кроме того, при необходимости я мог бы получить все потенциальные значения для combobox2 (для каждого значения combobox1) перед раздачей, но я бы хотел этого избежать, если смогу.

Как мне реализовать в WPF и с использованием MVVM? Я довольно новичок во всем этом мире wpf \ databinding \ mvvm.

Ответы [ 2 ]

2 голосов
/ 20 мая 2010

Что-то вроде следующего. Обратите внимание, что код радикально упрощен ради примера. В действительности ваш ViewModel будет реализовывать INotifyPropertyChanged и вызывать события PropertyChanged при изменении свойств.

Ключ, хотя и является установщиком SelectedState. Ваш ComboBox будет привязывать свое свойство SelectedValue к свойству ViewModel SelectedState. Когда свойство изменилось, коллекция ZipCodes перезагружается, с чем будет связан другой комбинированный список.

class MyViewModel {

    public ObservableCollection<string> States {
        get;
        private set;
    }

    public ObservableCollection<string> ZipCodes {
        get;
        private set;
    }

    public string SelectedState {
        get { return _selectedState; }
        set {
            _selectedState = value;
            LoadZipCodes(_selectedState);
        }
    }

    public string SelectedZipCode {
        get;
        set;
    }

    void LoadZipCodes(string state) {
        // repopulate the ZipCodes property
    }

}
0 голосов
/ 20 мая 2010

Другое решение. Примерная модель:

class StateViewModel
{
    public string StateName
    {
        get {...}
        set {...}
    }

    public ObservableCollection<ZipCodeViewModel> ZipCodes
    {
        get {...}
        set {...}
    }
}

class ZipCodeViewModel
{
    public string ZipCodeName
    {
        get {...}
        set {...}
    }
}

class MainViewModel
{
    public ObservableCollection<StateViewModel> States
    {
        get {...}
        set {...}
    }
}

И XAML:

<ComboBox ItemsSource="{Binding Path=States}" IsSynchronizedWithCurrentItem="True">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Label Content="{Binding Path=StateName}"></Label>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

<ContentControl Content="{Binding Path=States}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <ComboBox ItemsSource="{Binding Path=ZipCodes}">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Path=ZipCodeName}"></Label>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>
...