WPF ObservableCollection未在视图中更新

时间:2017-07-25 16:34:36

标签: c# wpf observablecollection

我正在使用MVVM开发一个项目,其中用户连接到数据库服务器,并在该服务器上显示要使用的数据库区域列表。对于区域列表,我使用的ComboBox将ItemSource绑定到ObservableCollection。

ComboBox ItemsSource="{Binding AreaCollecton}" SelectedItem="{Binding SelectedArea}"

在ViewModel中,我将ObservableCollection定义如下:

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更新。但是,一旦完成构建areaCollection,视图中的ComboBox中就不会显示任何内容。

我是WPF和MVVM的新手,所以我觉得我在这里缺少一些小东西。我已经查看了一些与此类问题有关的其他帖子,并在那里实施了建议,但仍然没有更新View,所以我不确定我缺少什么。非常感谢任何帮助。

编辑我在添加完整的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>

1 个答案:

答案 0 :(得分:4)

乍一看,我可以看到Combox itemSource名称与您在后面的代码中设置的名称不同。不应该是“AreaCollection”而不是“AreaCollecton”。如果能解决问题,请告诉我。