添加/删除项目后更新Listview

时间:2015-04-04 13:02:03

标签: c# listview windows-store-apps

如何在Windows Store应用程序中将项目添加到集合后刷新ListView?将项目添加到列表工作正常,但Listview不刷新。我试图实现 INotifyCollectionChanged ,但到底该怎样做才能使它工作?

编辑:XAML文件

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ListView HorizontalAlignment="Left" Height="437" Margin="10,120,0,0" VerticalAlignment="Top" Width="593" ItemsSource="{Binding Persons, Mode=TwoWay}" Background="#FF5D5D5D">
        <ListView.DataContext>
            <Model:School/>
        </ListView.DataContext>
    </ListView>
    <Button Content="Button" HorizontalAlignment="Left" Margin="7,64,0,0" VerticalAlignment="Top" Command="{Binding AddCommand, Mode=OneWay}">
        <Button.DataContext>
            <Model:School/>
        </Button.DataContext>            
    </Button>
</Grid>

C#代码:

class School
{
    private ObservableCollection<string> _persons = new ObservableCollection<string>()
    {
        "Name1", "Name2", "Name3"
    };

    public ObservableCollection<string> Persons
    {
        get { return _persons; }
    }

    private ICommand _addCommand;
    public ICommand AddCommand
    {
        get
        {
            return this._addCommand ??
                   (this._addCommand = new RelayCommand(Add));
        }
    }

    private void Add()
    {
        this._persons.Add("Name");
    }
}

1 个答案:

答案 0 :(得分:0)

使用 ObservableCollection 时,不需要添加 INotifyCollectionChanged - 它已经实现了所需的接口。

您的代码应该可以使用,但可能还有其他一些问题:

  • 检查ListView的 DataContext (在这种情况下是其父级)是否已正确设置 - 应该设置它,以便'ListView会找到' Persons property,

  • 还要检查 ItemTemplate 是否设置正确 - 例如:

    <ListView Name="myList" ItemsSource="{Binding Persons}">
       <ListView.ItemTemplate>
           <DataTemplate>
              <StackPanel Orientation="Horizontal">
                 <TextBlock Text="{Binding Name}"/>
                 <TextBlock Text="{Binding Surname}"/>
              </StackPanel>
           </DataTemplate>
       </ListView.ItemTemplate>
    </ListView>
    
  • 在您的情况下,您的ListView的 ItemsSource 不需要使用 TwoWay 绑定 - 您没有定义属性的设置者 Persons

编辑:

编辑完成后,我可以看到问题出在哪里 - 您为 ListView 按钮设置单独的 DataContext - 按钮是添加到自己的集合 - 不同于 ListView 绑定。进行简短测试 - 将两者的 DataContext 设置为相同的静态资源:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid.Resources>
        <Model:School x:Key="mySchool"/>
    </Grid.Resources>
    <ListView HorizontalAlignment="Left" VerticalAlignment="Stretch" Margin="10,120,0,0" ItemsSource="{Binding Persons}" Background="#FF5D5D5D"
              DataContext="{StaticResource mySchool}"/>
    <Button Content="Button" HorizontalAlignment="Left" Margin="7,64,0,0" VerticalAlignment="Top" Command="{Binding AddCommand, Mode=OneWay}"
            DataContext="{StaticResource mySchool}">
    </Button>
</Grid>