Silverlight 绑定到分页集合视图的视图未始终更新
我是silverlight的新手,尝试使用mvvm模式和ria服务创建业务应用程序。我有一个视图模型类,它包含PagedCollectInview,并设置为datagrid的项源。当我更新PagedCollectionView时,datagrid只会在第一次更新,之后对数据的后续更改才会反映在视图中,直到再次编辑之后。事情似乎推迟了一天 下面是我的xaml和代码隐藏的一个总结示例 这是我的视图模型的代码Silverlight 绑定到分页集合视图的视图未始终更新,silverlight,gridview,mvvm,ria,Silverlight,Gridview,Mvvm,Ria,我是silverlight的新手,尝试使用mvvm模式和ria服务创建业务应用程序。我有一个视图模型类,它包含PagedCollectInview,并设置为datagrid的项源。当我更新PagedCollectionView时,datagrid只会在第一次更新,之后对数据的后续更改才会反映在视图中,直到再次编辑之后。事情似乎推迟了一天 下面是我的xaml和代码隐藏的一个总结示例 这是我的视图模型的代码 public class CustomerContactLinks : INotifyPro
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=TwoWayCustomerContactLink是否继承INotifyPropertyChanges并在任何属性更改时触发事件?CustomerContactLink是从生成的代码中设置的实体。[MetadataTypeAttribute(typeof(CustomerContactLink.CustomerContactLinkMetadata))]公共部分类CustomerContactLink基本上是实现Contact.Address2的类在Address2发生更改时应触发属性更改事件。从您的代码中,我只在列表更改时看到通知。