WPF应用程序中的ListView数据不会刷新

4
我正在尝试使用存储过程和Entity Framework在WPF中将数据加载到ListView中。当我首次加载用户控件时,ListView正常加载数据。然后我调用相同的代码来刷新数据,通过调试可以看到ListItems计数发生了变化,但是前端屏幕上的数据没有更新。
XAML
<ListView Name="DocsListView" ItemsSource="{Binding}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Documents" DisplayMemberBinding="{Binding Documents}"/>
        </GridView>
    </ListView.View>
</ListView>

代码后台

public void LoadDocs()
{
    Context _Context = new Context();
    DocsListView.ItemsSource = null;
    DocsListView.ItemsSource = _Context.SP_GetDocuments(1).ToList();
    _Context = null;
}

请问有人能帮我找出我做错了什么吗?我正在使用VS2012、.Net 4.5和EF 5.0。


1
你调用相同的LoadDocs方法来刷新数据吗? - Nitin
是的,我调用LoadDocs方法来刷新数据。 - Brodie
1个回答

3
我不确定是什么原因导致了这个问题,一般来说,我建议使用DependencyProperty!但你可以尝试这样刷新ListView:
ICollectionView view = CollectionViewSource.GetDefaultView(DocsListView.ItemsSource);
view.Refresh();

如果这将成为一个更大的项目,我强烈建议您查看MVVM设计模式! WPF和MVVM很好地配合使用。你可以使用像MVVMLight这样的不错的库。
此外,您还应该查看INotifyPropertyChanged接口
XAML代码(不要忘记设置DataContext)
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <ListView Name="DocsListView" ItemsSource="{Binding Data}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Documents" DisplayMemberBinding="{Binding Documents}"/>
                </GridView>
            </ListView.View>
        </ListView>
    </Grid>
</Window>

C#后台代码(如果添加或删除项目,则ObservableCollection会自动刷新UI):

public ObservableCollection<YourEntity> Data
{
     get { return (ObservableCollection<YourEntity>)GetValue(DataProperty); }
     set { SetValue(DataProperty, value); }
}

// Using a DependencyProperty as the backing store for Data.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty DataProperty =
DependencyProperty.Register("Data", typeof(ObservableCollection<YourEntity>), typeof(MainWindow), null);

public void LoadDocs()
{
     Context _Context = new Context();
     if(Data == null)
     {
         Data = new ObservableCollection<YourEntity>();
     }
     else
     {
         Data.Clear();
     }
     foreach(var doc in _Context.SP_GetDocuments(1).ToList())
     {
         Data.Add(doc);
     }
     _Context = null;
}

当我到达那行代码时,Data.Clear为空。我是否忽略了设置它的地方?(MVVM是理想的,但这只是一个小应用程序) - Brodie
现在它应该能工作了,当然你必须先初始化数据属性!;-) - makim
我刚刚搞明白了!我在 MainWindow 中错误地创建了另一个 User Control 实例,并且在错误的 User Control 实例中调用了方法! - Brodie
啊,好的 :-) 我很高兴你找到了错误,但我仍然建议你坚持使用依赖属性或使用MVVM模式 ;-) - makim
谢谢你的帮助!我将使用你上面建议的代码,因为它现在完美地运行了,未来的应用程序我们一定会使用MVVM。 - Brodie
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接