WPF数据绑定更新comboxbox2基于combobox1与MVVM的选择更改

时间:2010-05-19 23:57:02

标签: wpf data-binding mvvm

我有一个组合框,我已绑定到我的viewmodel中存在的列表。现在,当用户在该组合框中进行选择时,我想要第二个组合框来更新其内容。

因此,例如,combobox1是States,combobox2应该只包含该状态的Zipcodes。

但是在我的情况下,我没有为combobox2提供预定义的列表,我需要从数据库中获取。

此外,如果需要,我可以预先获得combobox2的所有潜在值(对于每个combobox1值),但如果可以,我想避免这样做。

如何在WPF中实现并使用MVVM?我对整个wpf \ databinding \ mvvm世界都很陌生。

2 个答案:

答案 0 :(得分:2)

如下所示。注意,为了示例,代码被大大简化。实际上,ViewModel会在修改属性时实现INotifyPropertyChanged并引发PropertyChanged事件。

密钥虽然是SelectedState的setter。您的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
    }

}

答案 1 :(得分:0)

另一种解决方案。近似模型:

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>