Уведомление PropertyChanged для расчетных свойств

Вы должны обернуть свои AppBarLayout и свои LinearLayout в LayoutManager, чтобы упорядочить свои взгляды, вот пример

  <?xml version="1.0" encoding="utf-8"?>
  <android.support.design.widget.CoordinatorLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
  <android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/MyMaterialTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/MyMaterialTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="5dp" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
</LinearLayout>
</android.support.design.widget.CoordinatorLayout>
8
задан geofftnz 1 March 2009 в 01:30
поделиться

3 ответа

Традиционный способ сделать это должно добавить, что OnPropertyChanged звонит в каждое из свойств, которые могли бы влиять на Ваш расчетный, как это:

public bool IsLoaded
{
    get { return m_IsLoaded; }
    set
    {
        if (m_IsLoaded != value)
        {
            m_IsLoaded = value;
            OnPropertyChanged("IsLoaded");
            OnPropertyChanged("CanSave");
        }
    }
}

Это может стать немного грязным (если, например, Ваше вычисление в изменениях CanSave).

Один (инструмент для очистки? Я не знаю), способ двигаться, это должно было бы переопределить OnPropertyChanged и выполнить вызов там:

protected override void OnPropertyChanged(string propertyName)
{
    base.OnPropertyChanged(propertyName);
    if (propertyName == "IsLoaded" /* || propertyName == etc */)
    {
        base.OnPropertyChanged("CanSave");
    }
}
6
ответ дан 5 December 2019 в 19:03
поделиться

Как насчет этого решения?

private bool _previousCanSave;
private void UpdateCanSave()
{
    if (CanSave != _previousCanSave)
    {
        _previousCanSave = CanSave;
        OnPropertyChanged("CanSave");
    }
}

Затем назовите UpdateCanSave () в методах set IsLoaded и DatabaseBusy?

Если Вы не можете изменить методы set IsLoaded и DatabaseBusy, потому что они находятся в различных классах, Вы могли попытаться назвать UpdateCanSave () в обработчике событий PropertyChanged для определения объекта IsLoaded и DatabaseBusy.

1
ответ дан 5 December 2019 в 19:03
поделиться

Необходимо добавить, что уведомление для свойства CanSave изменяет везде одно из свойств, это зависит изменения:

OnPropertyChanged("DatabaseBusy");
OnPropertyChanged("CanSave");

И

OnPropertyChanged("IsEnabled");
OnPropertyChanged("CanSave");
2
ответ дан 5 December 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: