Привязка uwp к дочернему свойству не обновляется, когда parent становится нулевым - PullRequest
0 голосов
/ 10 октября 2019

У меня есть эта вложенная привязка к объекту ItemDescription , и по умолчанию свойство MyEvidence имеет значение null, поэтому оно отображается пустым, но как только я устанавливаю его значение для объекта EvidenceDTO,Значение itemDescription отображается, как и ожидалось.

Теперь, когда я снова установил для свойства MyEvidence значение null, я ожидаю, что текст ItemDescription снова будет пустым, но этого не происходит, очевидно, он не знает, что родительский объект являетсятеперь изменено / обнулено, так что дочерний объект больше не должен появляться. У меня есть INotifyPropertyChanged настройка для класса ViewModel, следовательно, для свойства MyEvidence, а также свойства ItemDescription в EvidenceDTO с вспомогательным классом, известным как Observable

Xaml Binding

<TextBlock Text="{x:Bind ViewModel.MyEvidence.ItemDescription, Mode=OneWay}" />

Инициализация ViewModel в бэкэнде страницы, например,

public MainViewModel ViewModel { get; } = new MainViewModel();

Код моей модели представления

public class MainViewModel : Observable
{
    private EvidenceDTO _myEvidence;
    public EvidenceDTO MyEvidence { get => _myEvidence; set => Set(ref _myEvidence, value); }
}

EvidenceDTO

public class EvidenceDTO : Observable
{
    private string _itemDescription;
    public string ItemDescription { get => _itemDescription; set => Set(ref _itemDescription, value); }
}

Наблюдаемый класс

public class Observable : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
    {
        if (Equals(storage, value))
        {
            return;
        }

        storage = value;
        OnPropertyChanged(propertyName);
    }

    protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

Я показываю ItemDescription в качестве примера, есть еще много свойств EvidenceDTO, которыеотображаются в пользовательском интерфейсе аналогичным образом, поэтому мне нужно какое-то универсальное решение, в котором уведомление об изменении свойства генерируется на всех уровнях пути привязки.

Ответы [ 2 ]

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

Установите ваше свойство ViewModel.MyEvidence = null, не уничтожая ваш объект MyEvidence. Ссылка на объект выходит за рамки, вы должны попытаться дать новую ссылку на ваш ViewModel.MyEvidence. попробуйте ниже одного => ViewModel.MyEvidence = new EvidenceDTO ();

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

Кажется, что когда вы устанавливаете MyEvidence в null, он все равно будет отображать ранее кэшированное значение, а при повторной инициализации MyEvidence он будет отображаться заново в соответствии со значением атрибута. Поэтому, если вы хотите, чтобы текст ItemDescription снова был пустым, лучше повторно инициализировать MyEvidence, например:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ViewModel.MyEvidence = new EvidenceDTO();
}

Если у вас более одного слоя вложенной модели, вы можете установить модель какниже в каждом слое вложенной модели. Когда вы устанавливаете MyEvidence в null, он вызывает метод get MyEvidence, а затем повторно инициализирует его в методе get.

public EvidenceDTO MyEvidence
{
    get
    {
        if (_myEvidence == null)
        {
            _myEvidence = new EvidenceDTO();
        }
        return _myEvidence;
    }
    set => Set(ref _myEvidence, value);
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    ViewModel.MyEvidence = null;
}
...