Вызов переопределенного метода в нескольких производных ViewModels - PullRequest
0 голосов
/ 12 марта 2020

Я борюсь с необычной реализацией Mvvm. У меня есть многостраничное приложение, в котором мне нужно получить доступ к некоторым свойствам в нескольких представлениях и убедиться, что изменения в одном представлении обновляются во всех из них. Я пытаюсь добиться этого с помощью следующей реализации:

public class BaseViewModel : ViewModelBase
{
    public string SharedProperty
    {
        get=>BaseModel.sharedProperty;
        set
        {
            if(CustomSet(ref BaseModel.sharedProperty, value, SharedRaise))
                ReloadStuff();
        }
    }
    public abstract void ReloadStuff();
    public void SharedRaise(string caller) => RaisePropertyChanged(caller);
    private bool CustomSet<T>(ref T prop, T value, Action<string> raise, [CallerMemberName] string caller)
    {
        if ((prop == null && value == null) || (prop != null && prop.Equals(value)))
            return false;

        prop = value;
        raise.Invoke(caller);

        return true;
    }
    public static class BaseModel
    {
        public static string sharedProperty;
    }
}

public class Child1ViewModel : BaseViewModel
{
    private string someData;
    public string SomeData
    {
        get=>someData;
        set=>Set(ref someData, value);
    }
    public override void ReloadStuff()
    {
        SomeData = GetNewData();
    }
}

public class Child2ViewModel : BaseViewModel
{
    private string someOtherData;
    public string SomeOtherData
    {
        get=>someData;
        set=>Set(ref someOtherData, value);
    }
    public override void ReloadStuff() { } //Do nothing, better would be to remove the overriden method in Child2ViewModel at all
}

Требуемое поведение должно быть следующим:

При изменении свойства SharedProperty из Child2View метод RaisePropertyChanged ("SharedProperty") должен вызываться на любом активном экземпляре, производном от BaseViewModel. Кроме того, каждый переопределенный метод ReloadStuff () в любом экземпляре, производном от BaseViewModel, должен вызываться.

К сожалению, пока это не работает, но сейчас я надеюсь, что я что-то пропустил, а не все это руби sh. Любая помощь будет принята с благодарностью.

...