微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Xamarin 中,应如何使用 Behaviors 和 Commands 来启动 ViewModel 中的操作?

如何解决在 Xamarin 中,应如何使用 Behaviors 和 Commands 来启动 ViewModel 中的操作?

简而言之,我已经设法使用行为和命令在我的视图中的控件发生事件后,在我的 viewmodel 中连接了一个要触发的操作,但这最终需要解决框架中的错误,该错误使我怀疑这是否是解决此类问题的正确方法

具体来说,我在我的 viewmodel 中执行了一些计算,我想在用户完成更新我的视图中的 Entry 控件后执行这些计算。我决定这应该挂起 Completed 事件。为了做到这一点,我像这样设置了我的代码

EntryCommand.cs

namespace SocialStocksCross.Command
{
    public class EntryCommand : ICommand
    {
        public Action _callback;

        public EntryCommand()
        {
        }

        public bool CanExecute(object test)
        {
            return true;
        }
        public void Execute(object test)
        {
            _callback();
        }

        public event EventHandler CanExecuteChanged;
    }
}

MainPageviewmodel.cs

public class MainPageviewmodel : INotifyPropertyChanged
{
    public MainPageviewmodel()
    {
        CommandVM = new EntryCommand();
        CommandVM._callback = CalculateStuff;
        UpdateLabel();
    }
    private EntryCommand _command;

    public EntryCommand CommandVM
    {
        get
        {
            return _command;
        }
        set
        {
            _command = value;
        }
    }
    
    public void CalculateStuff()
    {
      // does stuff
    }
}

我的行为类是这样定义的;

namespace SocialStocksCross.Behaviors
{
    class EntryBehavior : Behavior<Entry>
    {
        public static readonly BindableProperty CommandProperty =
               BindableProperty.Create("Command",typeof(ICommand),typeof(EntryBehavior),null);

        public ICommand Command
        {
            get
            {
                return (ICommand)GetValue(CommandProperty);
            }
            set
            {
                SetValue(CommandProperty,value);
            }
        }

        protected override void OnAttachedTo(Entry bindable)
        {
            base.OnAttachedTo(bindable);

            bindable.Completed += OnEntryCompleted;
            // Perform setup
        }

        protected override void OnDetachingFrom(Entry bindable)
        {
            base.OnDetachingFrom(bindable);
            // Perform clean up
        }

        void OnEntryTextChanged(object sender,TextChangedEventArgs e)
        {
            string oldText = e.OldTextValue;
            string newText = e.NewTextValue;
        }

        void OnEntryCompleted(object sender,EventArgs args)
        {
            if (BindingContext == null)
            {
                return;
            }
            // do something
            if (Command == null)
            {
                return;
            }

            Command.Execute(args);
        }
    }
}

我的观点的相关部分是这样的;

<Entry Grid.Column="1" Grid.Row="0" x:Name="companySymbol" Text="{Binding CompanySymbol}">
            <Entry.Behaviors>
                <localbehaviors:EntryBehavior Command="{Binding CommandVM,Mode=OneWayToSource}"></localbehaviors:EntryBehavior>
            </Entry.Behaviors>
        </Entry>

据我从网上阅读的内容来看,这似乎应该可行,但行为上的命令从未绑定到 viewmodel 上的命令。经过一番挖掘,结果命令的 BindingContext 始终为空,可能是由于这个错误,尽管因为它被标记关闭,我本以为它会被修复...... https://github.com/xamarin/Xamarin.Forms/issues/2581

我最终要做的是在 .cs 中手动设置 Behavior 的 BindingContext 以从 View 自己的 BindingContext 继承并以这种方式设置我的绑定。虽然我的代码现在工作,但如果这在框架中没有得到修复,我不得不怀疑是否有其他方式应该处理这种事情以及整个行为绑定只是真的不推荐?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。