• VS2012,.NET 4.51

  • 我有一个包含使用模型绑定(bind)的ListView的用户控件。到目前为止,一切都很好。我想根据用户如何操作 View 模式来显示对象列表。为此,我拥有一个称为“角色”的公共(public)属性(property)。但是,当我从那里调用TryUpdateModel()时,我收到异常:



    现在,尽管我了解了,但可以通过以下操作退出编辑模式:
    lvData.EditIndex = -1;
    

    然后在UpdateMethod中调用TryUpdateModel(),我想知道如何在无需连接方法进行更新的情况下调用TryUpdateModel。换句话说,我如何/在哪里/为IValueProvider提供TryUpdateModel()参数。
    /// <summary>
    ///     Initialise the user control
    /// </summary>
    /// <param name="aRoles">List of roles to display</param>
    public void Activate(List<RoleInfo> aRoles)
    {
        //List we will be binding
        _ViewModel = new List<MembershipRolesViewModel>();
    
        //Transfer the supplied list into the view model
        foreach (RoleInfo roleInfo in aRoles)
        {
            _ViewModel.Add(new MembershipRolesViewModel
            {
                RoleDisplayName = roleInfo.RoleDisplayName,
                RoleHint = roleInfo.RoleHint,
                RoleName = roleInfo.RoleName,
                RoleSelected = roleInfo.RoleSelected
            });
        }
    }
    
    //ListView.SelectMethod points here
    public IQueryable<MembershipRolesViewModel> RolesSelect()
    {
        return _ViewModel.AsQueryable();
    }
    
    //Property to return the roles as manipulated by the user
    public List<RoleInfo> Roles
    {
        get
        {
            List<RoleInfo> result = new List<RoleInfo>();
            TryUpdateModel(_ViewModel);
    
            foreach (MembershipRolesViewModel membershipRolesViewModel in _ViewModel)
            {
                result.Add(new RoleInfo
                {
                    RoleDisplayName = membershipRolesViewModel.RoleDisplayName,
                    RoleHint = membershipRolesViewModel.RoleHint,
                    RoleName = membershipRolesViewModel.RoleName,
                    RoleSelected = membershipRolesViewModel.RoleSelected
                });
            }
    
            return result;
        }
    }
    

    必须将TryUpdateModel传递给值提供程序,或者必须从使用模型绑定(bind)进行数据绑定(bind)的控件的数据操作方法内部调用ojit_code。

    最佳答案

    没有简单的方法可以从ListView项中获取值。您必须循环查看项目并提取其值。

    var bindableTemplate = lv.ItemTemplate as IBindableTemplate;
    foreach (ListViewItem item in lv.Items)
    {
        var dic = bindableTemplate.ExtractValues(item).Cast<System.Collections.DictionaryEntry>().ToDictionary(k => (string)k.Key, v => v.Value);
        var provider = new DictionaryValueProvider<object>(dic, System.Globalization.CultureInfo.InvariantCulture);
    
        // Now we can update the item.
        TryUpdateModel<RoleInfo>(model, provider);
    }
    

    或强制ListView更新自己的项目。
    public List<RoleInfo> Roles
    {
        get
        {
            List<RoleInfo> result = new List<RoleInfo>();
            for (int i = 0; i < lv.Items.Count; i++)
                if (lv.Items[i].ItemType == ListViewItemType.DataItem)
                    lv.UpdateItem(i, true);
    
            //...
    
            return result;
        }
    }
    
    
    
    public void lv_UpdateItem(int id)
    {
        RoleInfo model = //...
        TryUpdateModel(model);
    }
    

    希望这可以帮助。

    关于c# - 如何在数据操作方法之外调用TryUpdateModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21248909/

    10-10 13:47