Android ListView以编程方式绑定

时间:2015-09-06 19:12:03

标签: mvvmcross

有许多在axml中执行此操作的示例,但我希望使用后面的代码进行完整绑定。说实话,我想没有axml,但似乎以编程方式创建所有控件是一场噩梦。

我首先尝试了以下建议: MvxListView create binding for template layout from code

我有来自代码隐藏的列表绑定,我得到六行(因此源绑定工作正常);但是细胞本身并没有结合。

然后在以下网址: Odd issue with MvvmCross, MvxListViewItem on Android

斯图尔特有以下评论:看过了。在这种情况下,我不认为你想使用DelayBind。 DelayBind用于延迟绑定操作,直到下次设置DataContext为止。在Android的MvxAdapter / MvxListItemView情况下,DataContext在ctor中传递 - 因此DataContext不会再次设置,直到重用该单元格为止。 (这与iOS MvxTableDataSource不同。)

所以从本质上说,我看到的唯一例子是DelayBind,它不应该工作。

有人可以告诉我一些例子......提前谢谢。

添加了对评论的回复:

Cheesebaron,首先,非常感谢并尊重您的所有贡献;

现在,为什么不使用axml?好吧,作为程序员,我们都有自己的喜好和做事的方式 - 我想我是老学校,我们没有任何gui设计师(不是真的)。​​

真正的原因:

  1. 常见风格:我有一个设置,其中Core具有所有样式细节,包括所有颜色。我的想法是,每个平台都会从核心获取样式细节并相应地更新。我可以通过这种方式轻松创建具有正确风格的控件。

  2. 跨平台复制粘贴(如果需要,我甚至可以将其作为链接文件)。例如,我有一个带有类似Web的验证的登录屏幕,其中一个红色错误文本出现在控件下;在整个屏幕上我有大约10个需要绑定的项目。我已经有iOS版本了 - 所以从Droid开始,我从ios复制了整个绑定部分,它运行得很好。所以,整个绑定,我可以在所有平台上使它相同...我的方式中的任何可能的错误将停止在构建,我认为这是一个优于axml绑定的主要优势。即使控件创建非常相似,我也有相同方法名称的助手。

  3. 当然,我理解所有必须处理的附加布局;说实话,如果一个人真正想到它,那就没那么糟糕;我已经为Droid创建了一个基于WP的StackPanel,它内部处理子视图的所有布局;所以对于LinearLayout,我所做的只是设置一些自定义参数,让我的面板处理它。亲戚是一个不同的故事;到目前为止,我只有一个相对的屏幕,我甚至可以将其设为Linear以减少我的附加布局代码。

    所以,从我的谦逊的角度来看,对于我的风格,代码隐藏创建允许我完全复制我的所有绑定(我确实有一些自定义绑定工厂允许),复制我的所有控件创建行;然后只将那些控件添加到视图中是唯一不同的部分(然后再次,droid和WP几乎完全相同)。因此,我无法在一个平台上错过任何东西,而且所有人都被迫相同。它还允许我通过更改核心来更改每个平台的所有样式。最后,在编译期间检测到任何绑定错误 - 我喜欢它。

    我原来的问题并不是关于不使用axml ...它是关于如何使用MvxListView,其中所有绑定都在代码隐藏中完成;正如我所解释的那样,我得到了列表绑定,但没有项目/单元格绑定工作。

    提前再次感谢。

    这是我的droid登录屏幕的一部分;我认为没有axml文件可接受的代码量。

                //======================================================================================================
            // create and add all controls
            //======================================================================================================
            var usernameEntry = ControlHelper.GetUITextFieldCustom(this, "Username.", maxLength: 20);
            var usernameError = AddErrorLabel<UserAuthorization, string>(vm => ViewModel.Authorization.Username);
            var passwordEntry = ControlHelper.GetUITextFieldCustom(this, "Password.", maxLength: 40, secureTextEntry: true);
            var passwordError = AddErrorLabel<UserAuthorization, string>(vm => ViewModel.Authorization.Password);
            var loginButton = ControlHelper.GetUIButtonMain(this);
            var rememberMe = new UISwitch(this);
            var joinLink = ControlHelper.GetUIButtonHyperLink(this, textAlignment: UITextAlignment.Center);
            var copyRightText = ControlHelper.GetUILabel(this, textAlignment: UITextAlignment.Center);
            var copyRightSite = ControlHelper.GetUIButtonHyperLink(this, textAlignment: UITextAlignment.Center);
    
            var layout = new StackPanel(this, Orientation.Vertical)
            {
                Spacing = 15,
                SubViews = new View[]
                    {
                        ControlHelper.GetUIImageView(this, Resource.Drawable.logo),
                        usernameEntry,
                        usernameError,
                        passwordEntry,
                        passwordError,
                        loginButton,
                        rememberMe,
                        joinLink,
                        ControlHelper.GetSpacer(this, ViewGroup.LayoutParams.MatchParent, weight: 2),
                        copyRightText,
                        copyRightSite
                    }
            };
    

1 个答案:

答案 0 :(得分:0)

我在使用Mvx4时遇到了类似的情况。

你提到的第一个链接几乎是正确的当你从第二个链接中的Staurts注释中组合它并且只是删除周围的DelayBind调用时,一切都应该没问题 -

public class CustomListItemView
    : MvxListItemView
{
    public MvxListItemView(Context context,
                           IMvxLayoutInflater layoutInflater,
                           object dataContext,
                           int templateId)
        : base(context, layoutInflater, dataContext, templateId)
    {
        var control = this.FindViewById<TextView>(Resource.Id.list_complex_title);
        var set = this.CreateBindingSet<CustomListViewItem, YourThing>();
        set.Bind(control).To(vm => vm.Title);
        set.Apply();
    }
}

P.S。我已经要求编辑原始链接以帮助其他人。