选择标签时,ICommand并不总是触发

时间:2017-02-28 11:43:59

标签: xamarin.android mvvm-light

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

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

我在ICommands和Events之间的区别中是否遗漏了一些基本内容,还是其他什么?

我正在使用Xam.Android和MVVMLight

1 个答案:

答案 0 :(得分:0)

我找到了答案。当我创建分部类时,我定义了像这样的UI对象(或至少这样的东西)

EditText myEditText;
EditText MyEditText = myEditText ?? (view.FindViewById<EditText>(Resources.Id.myEdit);

这很好,但它确实意味着一旦定义,它就不会被重新定义。

如果UI实际上不会改变,则不成问题,但每次按下操作选项卡时,片段都会刷新。唯一的问题是Id没有改变,因为myEditText不为空。

答案是在UI定义代码中添加一个方法,该方法在主代码中使对象为空,当UI消失时,调用nulling方法。一切都有效