MVVM 架构中点击事件的位置

Posted

技术标签:

【中文标题】MVVM 架构中点击事件的位置【英文标题】:Location of click event in MVVM architecture 【发布时间】:2019-01-16 23:28:25 【问题描述】:

我正在尝试将 MVVM 与数据绑定一起使用。我应该在哪里编写点击事件(Viewmodel 或 Activity)

欢迎举例……

【问题讨论】:

【参考方案1】:

您可以在其中任何一个上编写您的点击事件。就个人而言,我的偏好取决于我想要实现什么以及实现它需要什么。

ViewModel 中的点击事件

定义您的 ViewModel。通过回调与您的活动进行通信。

public class MyViewModel extends ViewModel

    private MyCustomCallback callback;
    ...
    public void doOnClick(MyCustomCallback mCallback)
        boolean isSuccessful = doMyAction.execute();
        if (isSuccessful)
            mCallback.actionIsSuccessful();
         else 
            mCallback.actionFailed();
        
    
    ...
    public void setCallback(callback)
        this.callback = callback;   
    
    public MyCustomCallback getCallback()
        return this.callback;   
    
    ...

    public interface MyCustomCallback
        void actionIsSuccessful();
        void actionFailed();
    

在您的活动中实现此回调:

public class MyActivity extends AppCompatActivity
    ...
    private MyCustomCallback callback;
    @Override
    protected void onCreate(Bundle savedInstanceState)
        ...
        callback = new MyViewModel.MyCustomCallback
            @Override
            public void actionIsSuccessful()
                //do something when action is successful
            
            @Override
            public void actionFailed()
                //do something when action fails
            
        
        viewModel.setCallback(callback);
    

将您的 ViewModel 作为变量传递给您的 XML。然后这样做:

<Button
    android:layout_
    android:layout_
    android:background="@drawable/button_background"
    android:layout_margin="20dp"
    tools:text="CLICK ME!!!"
    android:textColor="@android:color/white"
    android:onClick="@() -> ViewModel.doOnClick(ViewModel.callback)"/>

Activity 中的点击事件

public class MyActivity extends AppCompatActivity
    ...
    private MyCustomCallback callback;
    @Override
    protected void onCreate(Bundle savedInstanceState)
        //initialize your binding
        ...
        binding.setClickHandler(new MyActivityClickHandler());
    

    public class MyActivityClickHandler
        public void onClickMeClicked(View view)
            //do something
        
    

然后在你的 XML 中:

<Button
    android:layout_
    android:layout_
    android:background="@drawable/button_background"
    android:layout_margin="20dp"
    android:text="@string/verify"
    android:textColor="@android:color/white"
    android:onClick="@ClickHandler::onClickMeClicked"/>

更多信息请查看官方文档here

【讨论】:

以上是关于MVVM 架构中点击事件的位置的主要内容,如果未能解决你的问题,请参考以下文章

js获取鼠标点击事件的相对位置

js获取鼠标点击事件的相对位置

js获取鼠标点击事件的相对位置

点击事件中光标的位置

wpf中mvvm的Command绑定后,如何在点击按钮的时候在viewmodel里面异步执行方法。

WPF datagrid 选择行点击事件?