我有一个组合框,我已绑定到我的viewmodel中存在的列表。现在,当用户在该组合框中进行选择时,我想要第二个组合框来更新其内容。
因此,例如,combobox1是States,combobox2应该只包含该状态的Zipcodes。
但是在我的情况下,我没有为combobox2提供预定义的列表,我需要从数据库中获取。
此外,如果需要,我可以预先获得combobox2的所有潜在值(对于每个combobox1值),但如果可以,我想避免这样做。
如何在WPF中实现并使用MVVM?我对整个wpf \ databinding \ mvvm世界都很陌生。
答案 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>