Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.android ICommand在选择tab时不总是触发_Xamarin.android_Mvvm Light - Fatal编程技术网

Xamarin.android ICommand在选择tab时不总是触发

Xamarin.android ICommand在选择tab时不总是触发,xamarin.android,mvvm-light,Xamarin.android,Mvvm Light,我有一个带有3个标签的简单操作栏。单击选项卡时,片段膨胀,视图显示。正在单击事件的选项卡是使用事件触发的。最初,第一个片段会膨胀,但如果单击,其他片段会响应并膨胀 如果我将触发的事件更改为ICommand,则只会膨胀最后一个片段,然后如果我单击第一个选项卡,则会膨胀最后一个片段。从来没有第二次 我的密码是 ICommand TabClicked { get { return new RelayCommand(() =>

我有一个带有3个标签的简单操作栏。单击选项卡时,片段膨胀,视图显示。正在单击事件的选项卡是使用事件触发的。最初,第一个片段会膨胀,但如果单击,其他片段会响应并膨胀

如果我将触发的事件更改为
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);