Уведомить свойство дочернего класса изменено - PullRequest
0 голосов
/ 15 октября 2019

Можно ли уведомлять об изменениях в дочернем классе? Как способ связывания ValueB уведомляется при изменении ValueA?

PropertyChangedEventHandler позволяет только уведомлять имя свойства.

Единственный способ, которым я вижу, - это добавить функциональность в класс Child для вызова уведомлений там (метод Notify) ..

public class Parent: INotifyPropertyChanged
{
    public Child ChildA
    {
        get; set;
    }

    public Child ChildB
    {
        get; set;
    }

    public int ValueA
    {
        get
        {
            return _valueA;
        }
        set
        {
            _valueA = value; 
            OnPropertyChanged(nameof(ValueA));
        }
    }

    public int ValueB
    {
        get
        {
            return _valueB;
        }
        set
        {
            _valueB = value; 
            OnPropertyChanged(nameof(ValueA));
            OnPropertyChanged(nameof(ValueB));
        }
    }

    public void RefreshBindings()
    {
        OnPropertyChanged(ChildA.Check);
        OnPropertyChanged(ChildB.Check);
    }
}

public class Child: INotifyPropertyChanged
{
    public void Notify(string property)
    {
        OnPropertyChanged(property);
    }

    public bool Check
    {
        get
        {
            return // something;
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Нет, это источник привязки, который должен реализовывать интерфейс INotifyPropertyChanged и генерировать уведомления об изменениях для платформы, чтобы иметь возможность обновлять привязки "автоматически".

Такесли вы связываете с ChildA.Check из Parent, то объект, возвращаемый свойством ChildA (т. е. классом Child), должен реализовывать INotifyPropertyChanged.

Другой параметр будет связываться ссвойства Parent, которые обертывают свойства Child, но Child все равно должен каким-то образом уведомлять родителя об изменении его состояния.

1 голос
/ 15 октября 2019

@ NawedNabiZada Я ценю ваши предложения, но они не работают. Пожалуйста, предлагайте это, только если вы точно знаете, что они работают.

Не уверен, что вы пытались, но моя точка зрения такова:

<Grid>
    <StackPanel>
        <StackPanel Orientation="Horizontal">
            <Label Content="Child A :"/>
            <Label Content="{Binding Path=ChildA.Check}"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <Label Content="Child B :"/>
            <Label Content="{Binding Path=ChildB.Check}"/>
        </StackPanel>

        <Button Content="Check/UnCheck" Command="{Binding Path=RefreshBindingCommand}"/>
    </StackPanel>
</Grid>

Родитель:

public class Parent : INotifyPropertyChanged
{
    public Child ChildA
    {
        get; set;
    }

    public Child ChildB
    {
        get; set;
    }

    public ICommand RefreshBindingCommand { get; }

    public Parent()
    {
        ChildA = new Child(true);
        ChildB = new Child(false);
        RefreshBindingCommand = new RelayCommand(RefreshBindingCommand_Execute);
    }

    void RefreshBindingCommand_Execute(object obj)
    {
        RefreshBindings();
    }

    public void RefreshBindings()
    {
        ChildA.Notify(nameof(ChildA.Check));
        ChildB.Notify(nameof(ChildB.Check));
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Ребенок:

public class Child : INotifyPropertyChanged
{
    private bool _check;    

    public bool Check
    {
        get
        {
            _check = !_check;
            return _check;
        }
    }

    public Child(bool check)
    {
        _check = check;
    }

    public void Notify(string property)
    {
        OnPropertyChanged(property);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

Доказательство того, что это работает: enter image description here

...