保存后WPF刷新主详细信息页面

时间:2014-06-12 18:42:29

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

我有一个桌面应用程序,允许从多台笔记本电脑更新表格中的信息。该程序编写如此,如果网络下降,人们可以继续工作。因为它具有专用的保存和刷新按钮而不是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上测试了这个。我将更新并保存在另一个上,然后在另一个上点击刷新,它应该显示更改。目前没有任何事情发生。

我必须相信我正在刷新错误的物品或物品。

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

1 个答案:

答案 0 :(得分:1)

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

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

所以,我给你的建议是让你查看你的初始数据加载代码,并在用户想要刷新UI时再次调用它(或者只是调用它的相关部分)。


更新&gt;&gt;&gt;

还有另一种选择,但它还有很多工作要做。我以前写了一些实时仪表板应用程序,所以我认为你可能会追求同样的事情。在初始加载数据之后我必须做的是不断地在数据库中查询更新的数据。当任何到达时,而不是重新加载所有集合,新项目只是添加到它们。

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