Xamarin.android ICommand在选择tab时不总是触发
我有一个带有3个标签的简单操作栏。单击选项卡时,片段膨胀,视图显示。正在单击事件的选项卡是使用事件触发的。最初,第一个片段会膨胀,但如果单击,其他片段会响应并膨胀 如果我将触发的事件更改为Xamarin.android ICommand在选择tab时不总是触发,xamarin.android,mvvm-light,Xamarin.android,Mvvm Light,我有一个带有3个标签的简单操作栏。单击选项卡时,片段膨胀,视图显示。正在单击事件的选项卡是使用事件触发的。最初,第一个片段会膨胀,但如果单击,其他片段会响应并膨胀 如果我将触发的事件更改为ICommand,则只会膨胀最后一个片段,然后如果我单击第一个选项卡,则会膨胀最后一个片段。从来没有第二次 我的密码是 ICommand TabClicked { get { return new RelayCommand(() =>
ICommand
,则只会膨胀最后一个片段,然后如果我单击第一个选项卡,则会膨胀最后一个片段。从来没有第二次
我的密码是
ICommand TabClicked
{
get
{
return new RelayCommand(() =>
{
tab.TabSelected += (object sender, ActionBar.TabEventArgs e) => TabOnTabSelected(sender, e);
});
}
}
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;
fragments.Add(new TODFragment());
fragments.Add(new ConditionsFragment());
fragments.Add(new ResultsFragment());
AddTabToActionBar("Time", Resource.Drawable.crucifix_colour);
AddTabToActionBar("Conditions", Resource.Drawable.weather_colour);
AddTabToActionBar("Results", Resource.Drawable.tod_colour);
}
void AddTabToActionBar(string text, int iconResourceId)
{
tab = ActionBar.NewTab().SetTag(text).SetText(text).SetIcon(iconResourceId);
/* uncomment and comment out one of the two below to see the difference in operation */
tab.TabSelected += TabOnTabSelected;
//tab.SetCommand<ActionBar.TabEventArgs>("TabSelected", TabClicked);
ActionBar.AddTab(tab);
}
void TabOnTabSelected(object sender, ActionBar.TabEventArgs tabEventArgs)
{
var tabNo = sender as ActionBar.Tab;
var frag = fragments[tabNo.Position];
tabEventArgs.FragmentTransaction.Replace(Resource.Id.frameLayout1, frag);
}
ICommand选项卡已单击
{
得到
{
返回新的RelayCommand(()=>
{
tab.TabSelected+=(对象发送者,ActionBar.TabEventArgs e)=>TabOnTabSelected(发送者,e);
});
}
}
创建时受保护的覆盖无效(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
ActionBar.NavigationMode=ActionBarNavigationMode.Tabs;
添加(新的TODFragment());
Add(新条件片段());
添加(新结果片段());
AddTabtActionBar(“时间”,资源,可绘制,十字架颜色);
添加选项卡操作栏(“条件”,资源。可绘制。天气颜色);
AddTabtActionBar(“结果”,Resource.Drawable.tod_color);
}
void addTabtActionBar(字符串文本,int-iconResourceId)
{
tab=ActionBar.NewTab().SetTag(text).SetText(text).SetIcon(iconResourceId);
/*取消注释并注释掉下面两个选项中的一个,以查看操作中的差异*/
tab.TabSelected+=TabOnTabSelected;
//tab.SetCommand(“TabSelected”,TabClicked);
ActionBar.AddTab(tab);
}
void TabOnTabSelected(对象发送方,ActionBar.TabEventArgs TabEventArgs)
{
var tabNo=作为ActionBar.Tab的发送者;
var frag=碎片[选项卡位置];
tabEventArgs.FragmentTransaction.Replace(Resource.Id.frameLayout1,frag);
}
在iCommand和Events之间的差异中,我是否遗漏了一些基本的东西,还是其他的东西
我正在使用Xam.Android和MVVMLight,我找到了答案。当我创建分部类时,我定义了这样的UI对象(至少是这样的)
EditText-myEditText;
EditText MyEditText=MyEditText??(view.findviewbyd(Resources.Id.myEdit);
这很好,但它确实意味着一旦定义,它就不会被重新定义
如果用户界面不是真的要更改,这不是问题,但是每次按下操作选项卡时,片段都会刷新。唯一的问题是Id没有更改,因为myEditText不为null
答案是在UI定义代码中添加一个方法,使对象为null,然后在主代码中,当UI消失时,调用null方法。然后一切都正常
EditText myEditText;
EditText MyEditText = myEditText ?? (view.FindViewById<EditText>(Resources.Id.myEdit);