【问题标题】:View bound to paged collection view not updating all of the time绑定到分页集合视图的视图不会一直更新
【发布时间】:2010-09-04 22:02:36
【问题描述】:

我是 silverlight 的新手,并尝试使用 mvvm 模式和 ria 服务制作一个业务应用程序。我有一个包含 PagedCollectoinView 的视图模型类,它被设置为数据网格的项目源。当我更新 PagedCollectionView 时,数据网格仅在第一次更新之后,随后对数据的更改不会反映在视图中,直到另一次编辑之后。事情似乎延迟了一次编辑。

下面是我的 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
}

这是我的 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();
            }
        }
    }

【问题讨论】:

    标签: silverlight gridview mvvm ria


    【解决方案1】:

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

    【讨论】:

    • CustomerContactLink 是否继承自 INotifyPropertyChanges 并在任何属性更改时触发事件?
    • CustomerContactLink 是生成代码的实体集。
    • [MetadataTypeAttribute(typeof(CustomerContactLink.CustomerContactLinkMetadata))] 公共部分类 CustomerContactLink
    • 基本上,实现 Contact.Address2 的类应该在 Address2 更改时触发属性更改事件。从您的代码中,我只在列表更改时看到通知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多