设计时间和时间的MVVM Web服务数据运行

时间:2011-02-01 03:06:09

标签: c# silverlight web-services mvvm

我最近看过John Papa的Service Patterns with SL from SL Firestarter 2010,它描述了我正在尝试实现的MVVM Light中的服务模式。我将在下面描述这个过程,但我想首先声明我能够让我的'设计时'数据工作没问题。我无法弄清楚的是我的运行时数据。不幸的是,我的客户端仍然使用旧式.asmx网络服务,而我的手与此相关。

在我的ViewModel中,我调用了IAccountService,这是我使用我的一个方法设置的接口:GetAccounts。从这里开始,我使用ServiceProviderBase类来确定调用是来自设计时还是运行时。当我从设计时调用此方法时,我加载了一个DesignAccountService,它使用DesignAccount模型来填充假数据,最终显示在我的Gridview中。它很有效,我很兴奋。

当我从运行时调用GetAccounts方法时,。这里的数据库人员编写并测试了一个将数据返回到数据表的Web服务,然后将其转换为ObservableCollection。此Web服务正在解决方案的Web项目中运行。我试图从我的SL项目中调用这个Web服务&抓住可观察的集合......好吧,所以代码:

在我的ViewModel中:

    protected TSMVVM.Services.IAccountService AccountService { get; set; }

    public AccountDefinitionViewModel(TSMVVM.Services.IAccountService accountService)
    {
        AccountService = accountService;
        LoadData();
    }
    public void LoadData()
    {
        LoadAccounts();
    }
    public void LoadAccounts()
    {
        Accounts = null;
        AccountService.GetAccounts(GetAccountsCallback);
    }
    private void GetAccountsCallback(ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS> accounts)
    {
        if (accounts != null)
        {
            this._accounts = accounts;
            if (_accounts.Count > 0)
            {
                SelectedAccount = Accounts[0];
            }
        }
    }
    private ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS> _accounts;
    public ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS> Accounts
    {
        get { return _accounts; }
        set
        {
            _accounts = value;
            RaisePropertyChanged("Accounts");
        }
    }

界面:

public interface IAccountService
{   
    void GetAccounts(Action<ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS>> getAccountsCallback);
}

的AccountService

        private ObservableCollection<TSMVVMCommonSVC.TSAccount> _account = new ObservableCollection<TSMVVMCommonSVC.TSAccount>();
    private TSMVVMCommonSVC.CommonSoapClient CommonService;
    private Action<ObservableCollection<TSMVVMCommonSVC.TSAccount>> _getAccountsCallback;

    public AccountService()
    {
    }
    public void GetAccounts(Action<ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS>> getAccountsCallback)
    {
        _getAccountsCallback = getAccountsCallback;
        Uri iSilverlightServiceUriRelative = new Uri(App.Current.Host.Source, "../Services/Common.asmx");
        EndpointAddress iSilverlightServiceEndpoint = new EndpointAddress(iSilverlightServiceUriRelative);
        BasicHttpBinding iSilverlightServiceBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);// Transport if it's HTTPS://
        CommonService = new TSMVVMCommonSVC.CommonSoapClient(iSilverlightServiceBinding, iSilverlightServiceEndpoint);
        CommonService.GetAccountCollectionCompleted +=new EventHandler<TSMVVMCommonSVC.GetAccountCollectionCompletedEventArgs>(CommonService_GetAccountCollectionCompleted);
        CommonService.GetAccountCollectionAsync();
    }
    private void CommonService_GetAccountCollectionCompleted(object sender,TSMVVMCommonSVC.GetAccountCollectionCompletedEventArgs e)
    {
        if (e.Result.Length > 0)
        {
            foreach (TSMVVMCommonSVC.TSAccount item in e.Result) {
                var acct = new TSMVVM.Model.P.P_ACCOUNTS() {
                     ACCOUNT_NUMBER = item.AccountNumber,
                     DESCRIPTION = item.AccountDescription
                };
                _account.Add(acct);
            }
        }
        _getAccountsCallback(_account);
    }

现在,如果我在GET for Accounts(我设置为返回_accounts)的ViewModel中放置一个断点,则会将Accounts设置为包含315个项目的项目集合。如果我深入研究该集合,我可以看到从我的Web服务成功返回数据。事实上,在这个断点处,如果我进入我的xaml(代码函数几乎完全相同的DataGrid而不是telerik控件),

        <telerik:RadGridView ItemsSource="{Binding Accounts}"
                                SelectedItem="{Binding SelectedAccount, Mode=TwoWay}"
                                AutoGenerateColumns="False">
        <telerik:RadGridView.Columns>
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Path=ACCOUNT_NUMBER}" Header="Account Number" />
            <telerik:GridViewDataColumn DataMemberBinding="{Binding Path=DESCRIPTION}" Header="Description" />
        </telerik:RadGridView.Columns>

    </telerik:RadGridView>

设置断点后,我可以看到我的ItemsSource绑定中的Accounts变量被设置为315个项目的集合。但是,网格是空的。我知道我的列绑定绑定到正确的项目,但我无法弄清楚从哪里开始。

1 个答案:

答案 0 :(得分:2)

更改此代码:

    if (accounts != null)
    {
        this._accounts = accounts;

    if (accounts != null)
    {
        this.Accounts = accounts;

因为事件PropertyChanged未在第一个代码中触发,并且UI不知道任何有关更改的信息。