【问题标题】:ListView Data Won't Refresh in WPF AppListView 数据不会在 WPF 应用程序中刷新
【发布时间】:2013-10-03 16:58:32
【问题描述】:

我正在尝试使用存储过程和实体框架将数据加载到 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。

【问题讨论】:

  • 你调用同一个LoadDocs方法刷新数据?
  • 是的,我调用LoadDocs方法刷新数据。

标签: c# wpf entity-framework listview


【解决方案1】:

我不确定是什么导致了问题,通常我会建议使用 DependencyProperty!

但您可以尝试像这样刷新 ListView:

ICollectionView view = CollectionViewSource.GetDefaultView(DocsListView.ItemsSource);
view.Refresh();

如果这将是一个更大的项目,我强烈建议您查看 MVVM DesignPattern!

WPF and MVVM 一起玩。您可以使用一些不错的库,例如 MVVMLight

你也应该看看INotifyPropertyChanged Interface

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 是理想的,但这是一个小应用程序)
  • 现在它应该可以工作了,当然你必须先初始化数据属性! ;-)
  • 谢谢,有帮助。但我仍然有同样的问题。 ListView 第一次加载完美,但调用完全相同的代码不会刷新 List。我什至在尝试 DocsListView.Items.Refresh() 并且 UI 没有更新。 :(
  • 您确定您在第二次通话中收到了不同的物品吗?也许 SP_GetDocuments 总是返回相同的结果!你能分享这个方法的代码吗
  • 我刚刚想通了!我从 MainWindow 错误地创建了另一个用户控件实例,并在错误的用户控件实例中调用了该方法!
猜你喜欢
  • 2012-08-14
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多