使用数据绑定和Kotlin观察Android中的类参数

使用数据绑定和Kotlin观察Android中的类参数,android,kotlin,mvvm,observable,android-databinding,Android,Kotlin,Mvvm,Observable,Android Databinding,我有一个模型 data class RegisterPostDataWithPwdCheck( var phone_number: String?, var name: String?, var password: String?, var secondPassword: String?) 和一个视图模型 class SignUpViewModel(application: Application) : BaseViewModel(application){

我有一个模型

data class RegisterPostDataWithPwdCheck(
    var phone_number: String?,
    var name: String?,
    var password: String?,
    var secondPassword: String?)
和一个视图模型

class SignUpViewModel(application: Application) : BaseViewModel(application){
        val registerPostData = MutableLiveData<RegisterPostDataWithPwdCheck>...
        fun checkPassword(){}...}
在XML中有两个感兴趣的字段

<EditText
android:id="@+id/edittext_sign_up_password"
android:text="@={view_model.registerPostData.password}" />
<EditText
android:id="@+id/edittext_sign_up_second_pw"
android:text="@={view_model.registerPostData.secondPassword}" />


到目前为止,我所理解的是,只有当整个
RegisterPostDataWithPwdCheck
对象发生更改时才会调用
.observe
,我不希望这样。我希望在任何参数更改时触发它,以便调用
fun checkPassword(){}
,查看这两个字段是否匹配。这可能吗

使用@mahdi shahbazi评论,我已经在Kotlin解决了这个问题。我的模型现在是:

data class RegisterPostDataWithPwdCheck(
@SerializedName(value = "phone_number")
private var phoneNumber: String?,
private var name: String?,
private var password: String?,
private var secondPassword: String?
) : BaseObservable() {

@Bindable
fun getPhoneNumber(): String? {
    return phoneNumber
}

fun setPhoneNumber(value: String) {
    if (value != phoneNumber) {
        phoneNumber = value
        notifyPropertyChanged(BR.phoneNumber)
    }
}

@Bindable
fun getName(): String? {
    return name
}

fun setName(value: String?) {
    if (value != name) {
        name = value
        notifyPropertyChanged(BR.name)
    }
}

@Bindable
fun getPassword(): String? {
    return password
}

fun setPassword(value: String?) {
    if (value != password) {
        password = value
        notifyPropertyChanged(BR.password)
    }
}

@Bindable
fun getSecondPassword(): String? {
    return secondPassword
}

fun setSecondPassword(value: String?) {
    if (value != secondPassword) {
        secondPassword = value
        notifyPropertyChanged(BR.secondPassword)
    }
}
}
以及创建自定义LiveData类:

class PropertyAwareMutableLiveData<T : BaseObservable> : MutableLiveData<T>() 
{

private val callback = object : Observable.OnPropertyChangedCallback() {
    override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
        value = value
    }
}

override fun setValue(value: T?) {
    super.setValue(value)
    value?.addOnPropertyChangedCallback(callback)
}
}
类属性yawaremutablelivedata:MutableLiveData()
{
private val callback=object:Observable.OnPropertyChangedCallback(){
覆盖已更改的属性(发送方:可观察?,属性ID:Int){
价值=价值
}
}
覆盖设置值(值:T?){
super.setValue(值)
值?.addOnPropertyChangedCallback(回调)
}
}

我仍然不知道是否有办法自动化这个@Binding过程,这个过程非常缓慢和枯燥,还需要进行一些更改(将参数转换为private)

选中此项,您也可以在ChangeText listener上使用编辑文本,并检查密码并将其保存,以便使用此链接。
class PropertyAwareMutableLiveData<T : BaseObservable> : MutableLiveData<T>() 
{

private val callback = object : Observable.OnPropertyChangedCallback() {
    override fun onPropertyChanged(sender: Observable?, propertyId: Int) {
        value = value
    }
}

override fun setValue(value: T?) {
    super.setValue(value)
    value?.addOnPropertyChangedCallback(callback)
}
}