【问题标题】:Unable to refresh/update data grid after insert in Silverlight 4在 Silverlight 4 中插入后无法刷新/更新数据网格
【发布时间】:2010-07-23 19:22:07
【问题描述】:

我正在创建一个主详细信息 silverlight 页面,并且在插入新记录后更新数据网格时遇到问题。在页面顶部,我有输入信息的文本框,当用户单击保存时,我希望信息在数据库中自动更新并显示在数据网格上,而无需刷新屏幕。

我能够毫无问题地将信息保存到数据库中,它只是试图让数据网格刷新新的更改。

我的一些保存按钮的代码如下:

ViewModel.UpdateWorkflow(summary, reason, Email);
LoadOperation<Document> lo = _Context.Load<Document>(_Context.GetDocumentsQuery(_DocID), rtRefresh, null);

rtRefresh 的代码:

private void rtRefresh(LoadOperation<Document> oLoadOperation)
    {            
        if (oLoadOperation.IsComplete)
        {                                                         
            ViewModel.GetDocuments(_DocID);
        }
    }

我将xaml文件中的ViewModel设置为:

<controls:ChildWindow.Resources>
    <viewModel:DocumentChildWindowViewModel x:Key="ViewModel" />
</controls:ChildWindow.Resources>

以及代码隐藏中的 ViewModel:

ViewModel = Resources["ViewModel"] as DocumentChildWindowViewModel;

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: c# silverlight datagrid silverlight-4.0


    【解决方案1】:

    我假设您的数据网格绑定到一个 IEnumerable,也许是一个 List?您是否尝试过使用 ObservableCollection?如果您绑定到 ObservableCollection,它将在集合发生更改时通知 UI。

    <UserControl x:Class="SilverlightApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:SilverlightApplication1"
    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400">
    
    <UserControl.DataContext>
        <local:MainPage_ViewModel/>
    </UserControl.DataContext>
    
    <StackPanel>
        <data:DataGrid ItemsSource="{Binding MyCollection}">
    
        </data:DataGrid>
    </StackPanel>
    

    public class MainPage_ViewModel : INotifyPropertyChanged
    {
        public ObservableCollection<object> MyCollection
        {
            get { return myCollection; }
            set 
            {
                if (myCollection != value)
                {
                    myCollection = value;
                    OnPropertyChanged("MyCollection");
                }
            }
        }
        private ObservableCollection<object> myCollection = new ObservableCollection<object>();
    
        public void LoadData()
        {
            //execute load method, the assign result to MyCollection
        }
    
        #region INotifyPropertyChanged Members
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        #endregion
    }
    

    【讨论】:

    • 只是将 GetDocumentsQuery() 从 IEnumerable 更改为 ObservableCollection 的问题吗?还是比这更复杂?
    • 我需要看到 XAML 和 viewModel 才能回答这个问题。您的数据网格应该有一个 ItemsSource 绑定到您的 viewModel 上的 ObservableCollection。当您从 GetDocumentsQuery() 取回数据时,您应该将其分配给 viewModel 上的 ObservableCollection。这有意义吗?
    • 感谢 JSprang 的帮助。我最终弄清楚了我的问题。我最终没有使用 ObservableCollection,但你让我大开眼界,为什么我不能让它工作。在我的 VieModel 中,我在第一次加载时创建了一个 _Context = new DomainContext(),并且由于某种原因,每次我尝试更新数据网格时,旧值都保持不变。所以我最终将 _Context = new DomainContext() 放入了实际刷新数据网格的函数中,并且它起作用了!
    【解决方案2】:

    在我的 ViewModel 中,我最初创建了一个新的 DomainContext():

    public DocumentWindowViewModel()
        {
            _Context = new appDomainContext();                       
            WireCommands();
        }
    

    我最终不得不将以下行复制到我的查询中:

    _Context = new appDomainContext();
    

    并粘贴到从数据库中获取值的函数:

    public void GetDocuments(int dID)
        {           
                _Context = new appDomainContext();  //ADDED THIS LINE TO FIX MY ISSUE                              
                _Context.Load(_Context.GetDocumentsQuery(dID), dlo =>
                    {
                        DocumentsView = dlo.Entities;                                                
                    }, null);                                
            }
        }
    

    _Context 保留旧值。这清除了 _Context 并允许我在 _Context 中拥有更新的数据。

    【讨论】:

      【解决方案3】:

      您的问题可能与域上下文 Load() 方法的默认 LoadBehavior 有关。尝试将 LoadBehaviour 显式设置为 LoadBehaviour.RefreshCurrent。有关 LoadBehaviour 的更多信息,请参阅:http://msdn.microsoft.com/en-us/library/system.servicemodel.domainservices.client.loadbehavior(v=VS.91).aspx

      有时,例如在删除之后,您还需要 Clear() 域上下文中的 EntityContainer 或至少 Clear() 为您尝试加载的实体的特定 EntitySet,以便正确的实体成为显示出来。

      比如,MyDomainContext.EntityContainer.GetEntitySet().Clear();

      【讨论】:

        猜你喜欢
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 2016-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多