【问题标题】:WPF refresh master detail page after save保存后WPF刷新主详细信息页面
【发布时间】:2014-08-03 05:00:22
【问题描述】:

我有一个桌面应用程序,允许从多台笔记本电脑更新表格中的信息。该程序是这样编写的,因此如果网络中断,人们可以继续工作。因此,它有一个专用的保存和刷新按钮,而不是 2 路绑定。但我无法让刷新工作。它使用列表框作为主框,使用网格获取详细信息。

XAML:

<Window.Resources>
    <CollectionViewSource x:Key="nJSSEntriesViewSource" d:DesignSource="{d:DesignInstance my:NJSSEntry, CreateList=True}" CollectionViewType="{x:Type ListCollectionView}"/>
</Window.Resources>
<Grid DataContext="{StaticResource nJSSEntriesViewSource}" Height="858">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="720*" />
        <RowDefinition Height="138"/>
    </Grid.RowDefinitions>
    <ListBox Height="626" HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="200" DisplayMemberPath="FullName" ItemsSource="{Binding}" Margin="0,25,0,0" />

C#

private CombinedShowsContext _combinedShowsContext;
private CollectionViewSource _nJssEntriesViewSource;

private ListCollectionView _showsEntriesView;

private System.Data.Objects.ObjectQuery<NJSSEntry> GetNJSSEntriesQuery(CombinedShowsContext combinedShowsContext)
{
    System.Data.Objects.ObjectQuery<NJSSEntry> nJssEntriesQuery = combinedShowsContext.NJSSEntries;
    // Returns an ObjectQuery.
    return nJssEntriesQuery;
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{

    _combinedShowsContext = new CombinedShowsContext();

    _nJssEntriesViewSource = ((CollectionViewSource)(FindResource("nJSSEntriesViewSource")));
    System.Data.Objects.ObjectQuery<NJSSEntry> nJssEntriesQuery = GetNJSSEntriesQuery(_combinedShowsContext);
    _nJssEntriesViewSource.Source = nJssEntriesQuery.Execute(System.Data.Objects.MergeOption.AppendOnly);

    _showsEntriesView = (ListCollectionView) _nJssEntriesViewSource.View;

}

private void RefreshButton1_Click(object sender, RoutedEventArgs e)
{
    try
    {
        //_nJssEntriesViewSource.View.Refresh();
        //_showsEntriesView.Refresh();
        //listBox1.Items.Refresh();
        CollectionViewSource.GetDefaultView(listBox1.ItemsSource).Refresh();
        MessageBox.Show("Refreshed", "Refreshed",
                                                            MessageBoxButton.OK);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "Refresh Failed",
                                                            MessageBoxButton.OK);
    }

}

我已经在安装了该程序的两台 VMS 上对此进行了测试。我将更新并保存一个,然后点击另一个刷新,它应该会显示更改。目前没有任何反应。

我必须相信我刷新了错误的项目或对象。

我最终想用颜色更新列表框项目,以显示刷新后条目是否更新。

【问题讨论】:

    标签: c# wpf entity-framework-4 master-detail


    【解决方案1】:

    如果我对您的理解正确,您将无法刷新您的观点。如果您的观点从未奏效或显示任何数据,那么此建议对您没有帮助。但是,如果您的视图在加载时确实加载了数据,那么您只需要对您的问题有一点不同的看法。

    您说您的视图不会刷新,但是(如果您仍在阅读,那么我将假设这一点)您的视图最初会加载数据。这两件事并不相互排斥...实际上刷新视图通常与加载视图完全相同...您只需重新加载视图中的数据即可。

    因此,我对您的建议是,您可以查看初始数据加载代码,并在用户想要刷新 UI 时再次调用该代码(或仅调用它的相关部分)。


    更新>>>

    还有一个替代方案,但工作量要大得多。我以前写过一些实时仪表板应用程序,所以我想你可能会追求同样的事情。在初始加载数据后,我必须做的是不断查询数据库以获取更新的数据。当任何物品到达时,无需重新加载所有收藏品,而是将新物品简单地添加到其中。

    但是,问题是您还必须查询数据库以获取任何已更改的数据,因此您需要执行大量数据比较以更新已更改的对象并删除已删除的对象。工作量很大,但它为您提供了另一种选择。

    【讨论】:

    • 如果我再次调用 window_loaded 那么它会刷新整个页面,但它也会杀死列表视图中的任何过滤使用。也许这是刷新的唯一方法,但它会妨碍用户。我会测试一下。谢谢。
    • 这帮助我接近了我需要的东西,设置为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2019-08-23
    • 1970-01-01
    • 2015-06-27
    相关资源
    最近更新 更多