有许多在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设计师(不是真的)。
真正的原因:
常见风格:我有一个设置,其中Core具有所有样式细节,包括所有颜色。我的想法是,每个平台都会从核心获取样式细节并相应地更新。我可以通过这种方式轻松创建具有正确风格的控件。
跨平台复制粘贴(如果需要,我甚至可以将其作为链接文件)。例如,我有一个带有类似Web的验证的登录屏幕,其中一个红色错误文本出现在控件下;在整个屏幕上我有大约10个需要绑定的项目。我已经有iOS版本了 - 所以从Droid开始,我从ios复制了整个绑定部分,它运行得很好。所以,整个绑定,我可以在所有平台上使它相同...我的方式中的任何可能的错误将停止在构建,我认为这是一个优于axml绑定的主要优势。即使控件创建非常相似,我也有相同方法名称的助手。
当然,我理解所有必须处理的附加布局;说实话,如果一个人真正想到它,那就没那么糟糕;我已经为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
}
};
答案 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。我已经要求编辑原始链接以帮助其他人。