我正在使用 MVVM 进行一个项目,其中用户连接到数据库服务器,并显示该服务器上要使用的数据库区域列表。对于区域列表,我使用的是将ItemSource绑定到ObservableCollection的组合框。
ComboBox ItemsSource="{Binding AreaCollecton}" SelectedItem="{Binding SelectedArea}"
在视图模型中,我有如下定义的可观察集合:
private ObservableCollection<string> areaCollection = new ObservableCollection<string>();
public ObservableCollection<string> AreaCollection
{
get { return areaCollection; }
set{
areaCollection = value;
OnPropertyChanged("AreaCollection");
}
}
输入服务器名称并单击"连接"按钮时,集合将更新。Click 事件将轮询输入的服务器以查找哪些区域可用,并将列表返回到 ViewModel。
public void Connect()
{
areaCollection.Clear();
serverConnection = new ServerConnect();
areaList = serverConnection.getAreaList(server);
//areaList is defined as a Dictionary<string, string>
foreach(KeyValuePair<string, string> area in areaList)
{
areaCollection.Add(area.Key);
}
OnPropertyChanged("AreaCollection");
}
我在 Connect 方法(从按钮单击事件调用(中的 foreach 处放置了一个断点,当我逐步完成时,我看到 areaCollection 正在按预期从 areaList 更新。但是,一旦它完成了建筑区域集合,视图上的组合框中不会显示任何内容。
我对 WPF 和 MVVM 相当陌生,所以我有一种感觉,我在这里缺少一些小东西。我已经浏览了这里与类似问题相关的其他一些帖子,并在那里实施了建议,但它仍然没有更新视图,所以我不确定我错过了什么。任何帮助将不胜感激。
编辑:我正在添加完整的XAML,以防这比ComboBox行更有用。
<Grid Height="400" Width="400" VerticalAlignment="Center" HorizontalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="1.5*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="50" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="lblPrompt" TextWrapping="Wrap" Text="Enter Laboratory login and connection info:" FontSize="18" />
<Label Style="{StaticResource ConnectLabel}" Grid.Row="1" Grid.Column="0" Content="Server:" />
<TextBox Style="{StaticResource ConnectTextBox}" Grid.Row="1" Grid.Column="1" x:Name="txtbxServerName" TextWrapping="Wrap" TabIndex="3" Text="{Binding Server}" />
<Button Style="{StaticResource ConnectButton}" Grid.Row="2" Grid.Column="1" x:Name="btnConnect" Content="Connect" FontSize="14">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="Connect" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Label Style="{StaticResource ConnectLabel}" Grid.Row="3" Grid.Column="0" Content="Area:" />
<ComboBox Style="{StaticResource ConnectCombo}" Grid.Row="3" Grid.Column="1" x:Name="txtbxAreaName" TabIndex="4" ItemsSource="{Binding AreaCollecton}" SelectedItem="{Binding SelectedArea}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="AreaConnect" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
<Label Style="{StaticResource ConnectLabel}" Grid.Row="4" Grid.Column="0" Content="Lab Username:" />
<TextBox Style="{StaticResource ConnectTextBox}" Grid.Row="4" Grid.Column="1" x:Name="txtbxUsername" TextWrapping="Wrap" TabIndex="1" Text="{Binding Username}" />
<Label Style="{StaticResource ConnectLabel}" Grid.Row="5" Grid.Column="0" Content="Lab Password:" />
<PasswordBox Margin="2" Grid.Row="5" Grid.Column="1" x:Name="pwdbxPassword" TabIndex="5" PasswordChanged="PasswordBox_PasswordChanged" />
<Button Style="{StaticResource ConnectButton}" Grid.Row="6" Grid.Column="1" x:Name="btnLogin" Content="Login" FontSize="14">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:CallMethodAction TargetObject="{Binding}" MethodName="Login" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<TextBlock Grid.Row="7" Grid.ColumnSpan="2" HorizontalAlignment="Center" Margin="10" TextWrapping="Wrap" FontSize="14" Text="{Binding Status}" />
</Grid>
乍一看,我可以看到 Combox itemSource 名称与您在代码隐藏中设置的名称不同。不应该是"AreaCollection"而不是"AreaCollecton"。让我知道是否可以解决问题。