Silverlight 绑定到分页集合视图的视图未始终更新

Silverlight 绑定到分页集合视图的视图未始终更新,silverlight,gridview,mvvm,ria,Silverlight,Gridview,Mvvm,Ria,我是silverlight的新手,尝试使用mvvm模式和ria服务创建业务应用程序。我有一个视图模型类,它包含PagedCollectInview,并设置为datagrid的项源。当我更新PagedCollectionView时,datagrid只会在第一次更新,之后对数据的后续更改才会反映在视图中,直到再次编辑之后。事情似乎推迟了一天 下面是我的xaml和代码隐藏的一个总结示例 这是我的视图模型的代码 public class CustomerContactLinks : INotifyPro

我是silverlight的新手,尝试使用mvvm模式和ria服务创建业务应用程序。我有一个视图模型类,它包含PagedCollectInview,并设置为datagrid的项源。当我更新PagedCollectionView时,datagrid只会在第一次更新,之后对数据的后续更改才会反映在视图中,直到再次编辑之后。事情似乎推迟了一天

下面是我的xaml和代码隐藏的一个总结示例

这是我的视图模型的代码

public class CustomerContactLinks : INotifyPropertyChanged
{
    private ObservableCollection<CustomerContactLink> _CustomerContact;
    public ObservableCollection<CustomerContactLink> CustomerContact
    {
        get
        {
            if (_CustomerContact == null)
                _CustomerContact = new ObservableCollection<CustomerContactLink>();
            return _CustomerContact;
        }
        set
        {
            _CustomerContact = value;
        }
    }

    private PagedCollectionView _CustomerContactPaged;
    public PagedCollectionView CustomerContactPaged
    {
        get
        {
            if (_CustomerContactPaged == null)
                _CustomerContactPaged = new PagedCollectionView(CustomerContact);
            return _CustomerContactPaged;
        }
    }

    private TicketSystemDataContext _ctx;
    public TicketSystemDataContext ctx
    {
        get
        {
            if (_ctx == null)
                _ctx = new TicketSystemDataContext();
            return _ctx;
        }
    }

    public void GetAll()
    {
        ctx.Load(ctx.GetCustomerContactInfoQuery(), LoadCustomerContactsComplete, null);
    }

    private void LoadCustomerContactsComplete(LoadOperation<CustomerContactLink> lo)
    {
        foreach (var entity in lo.Entities)
        {
            CustomerContact.Add(entity as CustomerContactLink);
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    #endregion
}
公共类CustomerContactLinks:INotifyPropertyChanged
{
私人可观察收集(CustomerContact);;
公共可见收集客户联系人
{
得到
{
如果(_CustomerContact==null)
_CustomerContact=新的ObservableCollection();
退货-客户联系;
}
设置
{
_客户联系=价值;
}
}
private PagedCollectionView_CustomerContactPaged;
公共页面集合视图客户联系人页面
{
得到
{
如果(_CustomerContactPaged==null)
_CustomerContactPaged=新页面集合视图(CustomerContact);
return\u CustomerContactPaged;
}
}
私人票务系统数据上下文ctx;
公共票证系统数据上下文ctx
{
得到
{
如果(_ctx==null)
_ctx=新的TicketSystemDataContext();
返回ctx;
}
}
public void GetAll()
{
Load(ctx.GetCustomerContactInfoQuery(),LoadCustomerContactsComplete,null);
}
私有void LoadCustomerContactsComplete(加载操作lo)
{
foreach(lo.Entities中的var实体)
{
添加(实体为CustomerContactLink);
}
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
私有void RaisePropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
this.PropertyChanged(this,newpropertychangedventargs(propertyName));
}
}
#端区
}
以下是我的XAML的基本知识

     <Data:DataGrid x:Name="GridCustomers" MinHeight="100" MaxWidth="1000" IsReadOnly="True" AutoGenerateColumns="False">
                    <Data:DataGrid.Columns>
                        <Data:DataGridTextColumn Header="First Name" Binding="{Binding Customer.FirstName}" Width="105" />
                        <Data:DataGridTextColumn Header="MI" Binding="{Binding Customer.MiddleName}" Width="35" />
                        <Data:DataGridTextColumn Header="Last Name" Binding="{Binding Customer.LastName}" Width="105"/>
                        <Data:DataGridTextColumn Header="Address1" Binding="{Binding Contact.Address1}" Width="130"/>
                        <Data:DataGridTextColumn Header="Address2" Binding="{Binding Contact.Address2}" Width="130"/>
                        <Data:DataGridTextColumn Header="City" Binding="{Binding Contact.City}" Width="110"/>
                        <Data:DataGridTextColumn Header="State" Binding="{Binding Contact.State}" Width="50"/>
                        <Data:DataGridTextColumn Header="Zip" Binding="{Binding Contact.Zip}" Width="45"/>
                        <Data:DataGridTextColumn Header="Home" Binding="{Binding Contact.PhoneHome}" Width="85"/>
                        <Data:DataGridTextColumn Header="Cell" Binding="{Binding Contact.PhoneCell}" Width="85"/>
                        <Data:DataGridTextColumn Header="Email" Binding="{Binding Contact.Email}" Width="118"/>
                        </Data:DataGrid.Columns>
                </Data:DataGrid>

 <DataForm:DataForm x:Name="CustomerDetails" Header="Customer Details" AutoGenerateFields="False" AutoEdit="False" AutoCommit="False" 
                                  CommandButtonsVisibility="Edit"
                                  Width="1000" Margin="0,5,0,0">

                    <DataForm:DataForm.EditTemplate>

                    </DataForm:DataForm.EditTemplate>

                </DataForm:DataForm>

这是我的密码

    public Customers()
    {
        InitializeComponent();
        BusyDialogIndicator.IsBusy = true;
        Loaded += new RoutedEventHandler(Customers_Loaded);
        CustomerDetails.BeginningEdit += new EventHandler<System.ComponentModel.CancelEventArgs>(CustomerDetails_BeginningEdit);
    }

    void CustomerDetails_BeginningEdit(object sender, System.ComponentModel.CancelEventArgs e)
    {
        CustomerContacts.CustomerContactPaged.EditItem(CustomerDetails.CurrentItem);
    }

    private void Customers_Loaded(object sender, RoutedEventArgs e)
    {
        CustomerContacts = new CustomerContactLinks();
        CustomerContacts.GetAll();
        GridCustomers.ItemsSource = CustomerContacts.CustomerContactPaged;
        GridCustomerPager.Source = CustomerContacts.CustomerContactPaged;
        GridCustomers.SelectionChanged += new SelectionChangedEventHandler(GridCustomers_SelectionChanged);
        BusyDialogIndicator.IsBusy = false;
    }


    void GridCustomers_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        CustomerDetails.CurrentItem = GridCustomers.SelectedItem as CustomerContactLink;
    }


    private void SaveChanges_Click(object sender, RoutedEventArgs e)
    {
        if (WebContext.Current.User.IsAuthenticated)
        {
            bool commited = CustomerDetails.CommitEdit();
            if (commited && (!CustomerDetails.IsItemChanged && CustomerDetails.IsItemValid))
            {
                CustomerContacts.Update(CustomerDetails.CurrentItem as CustomerContactLink);
                CustomerContacts.ctx.SubmitChanges();
                CustomerContacts.CustomerContactPaged.CommitEdit();
                CustomerContacts.CustomerContactPaged.Refresh();       
                (GridCustomers.ItemsSource as PagedCollectionView).Refresh();
            }
        }
    }
公共客户()
{
初始化组件();
BusyDialogIndicator.IsBusy=true;
已加载+=新路由EventHandler(已加载客户);
CustomerDetails.BeginingEdit+=新事件处理程序(CustomerDetails\u BeginingEdit);
}
无效CustomerDetails\u BeginingEdit(对象发送方,System.ComponentModel.CancelEventArgs e)
{
CustomerContacts.CustomerContactPaged.EditItem(CustomerDetails.CurrentItem);
}
已加载私有无效客户(对象发送方、路由目标)
{
CustomerContacts=新CustomerContactLinks();
CustomerContacts.GetAll();
GridCustomers.ItemsSource=CustomerContacts.CustomerContactPaged;
GridCustomerPage.Source=CustomerContacts.CustomerContactPaged;
GridCustomers.SelectionChanged+=新的SelectionChangedEventHandler(GridCustomers\u SelectionChanged);
BusyDialogIndicator.IsBusy=false;
}
void GridCustomers\u SelectionChanged(对象发送者,selectionchangedventargs e)
{
CustomerDetails.CurrentItem=GridCustomers.SelectedItem作为CustomerContactLink;
}
私有void保存更改\u单击(对象发送方,路由目标)
{
如果(WebContext.Current.User.IsAuthenticated)
{
bool committed=CustomerDetails.committedit();
if(提交和(!CustomerDetails.IsItemChanged和&CustomerDetails.IsItemValid))
{
CustomerContacts.Update(CustomerDetails.CurrentItem作为CustomerContactLink);
CustomerContacts.ctx.SubmitChanges();
CustomerContacts.CustomerContactPaged.CommittedIt();
CustomerContacts.CustomerContactPaged.Refresh();
(GridCustomers.ItemsSource作为PagedCollectionView.Refresh();
}
}
}

您必须在XAML绑定中设置Mode=TwoWay

CustomerContactLink是否继承INotifyPropertyChanges并在任何属性更改时触发事件?CustomerContactLink是从生成的代码中设置的实体。[MetadataTypeAttribute(typeof(CustomerContactLink.CustomerContactLinkMetadata))]公共部分类CustomerContactLink基本上是实现Contact.Address2的类在Address2发生更改时应触发属性更改事件。从您的代码中,我只在列表更改时看到通知。