Представление, привязанное к просмотру выгружаемой коллекции, не обновляется постоянно - PullRequest
0 голосов
/ 05 сентября 2010

Я новичок в 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();
            }
        }
    }

1 Ответ

0 голосов
/ 05 сентября 2010

Вы должны установить Mode = TwoWay в привязке XAML

...