Вы должны обернуть свои 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>
Традиционный способ сделать это должно добавить, что 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");
}
}
Как насчет этого решения?
private bool _previousCanSave;
private void UpdateCanSave()
{
if (CanSave != _previousCanSave)
{
_previousCanSave = CanSave;
OnPropertyChanged("CanSave");
}
}
Затем назовите UpdateCanSave () в методах set IsLoaded и DatabaseBusy?
Если Вы не можете изменить методы set IsLoaded и DatabaseBusy, потому что они находятся в различных классах, Вы могли попытаться назвать UpdateCanSave () в обработчике событий PropertyChanged для определения объекта IsLoaded и DatabaseBusy.
Необходимо добавить, что уведомление для свойства CanSave изменяет везде одно из свойств, это зависит изменения:
OnPropertyChanged("DatabaseBusy");
OnPropertyChanged("CanSave");
И
OnPropertyChanged("IsEnabled");
OnPropertyChanged("CanSave");