UWP C# Поднимает уведомление для комбинированного/составного свойства

#c# #uwp #properties #inotifypropertychanged

Вопрос:

У меня есть очень простое составное свойство, в котором я соединяю 2 строки вместе, чтобы создать третье свойство только для чтения, чтобы я мог привязать только 1 свойство к xaml.

 public string LocationCompleteString => $"{LocationName}/{SubLocationName}";
 

Что работает, как и ожидалось, но проблема в том, что я также хочу повысить оценку для LocationCompleteString всякий раз, когда обновляется «Имя местоположения» или «Имя суб-местоположения», для этого я попытался выполнить следующее:

 public MyClass() => PropertyChanged  = MyClass_PropertyChanged;
private void MyClass_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if(e.PropertyName == nameof(LocationName) || e.PropertyName == nameof(SubLocationName))
        {
            RaisePropertyChanged(LocationCompleteString);
        }
    }
 

Но это не работает, потому что это не обновить значение LocationCompleteString поэтому, прежде чем повышать уведомления для начала мне нужно как-то обновить его значение, я знаю, что я могу сделать частный метод, который возвращает значение для этого свойства, а затем просто, прежде чем повышать уведомление, я могу изменить его значение снова с помощью этого метода, но мне было интересно, если есть лучший и более универсальный способ достичь этого? может быть, каким-то образом я могу вызвать метод «LocationCompleteString.Get ()», который снова выполнит свой метод get для обновления значения или что-то в этом роде?

Пример проекта : https://github.com/touseefbsb/CompoundNotify

Спасибо.

Комментарии:

1. Можете ли вы поделиться полным примером кода, я протестирую базу на вашей демо-версии.

2. @NicoZhu-MSFT Я добавил соответствующий пример проекта.

3. Я ответил на приведенный ниже ответ, пожалуйста, проверьте его .

4. Пожалуйста, перейдите в эту строку , замените ее на RaisePropertyChanged(nameof(LocationCompleteString));

Ответ №1:

Похоже, вы неправильно позвонили RaisePropertyChanged , пожалуйста, обратитесь к следующему коду. Я проверил, это хорошо работает на моей стороне.

 public class MyClass : INotifyPropertyChanged
{
    public MyClass() => PropertyChanged  = MyClass_PropertyChanged;

    public event PropertyChangedEventHandler PropertyChanged;

    private string _locationName;
    private string _subLocationName;
    private string _locationCompleteString;
    public string LocationName
    {
        get
        {
            return _locationName;
        }

        set
        {
            _locationName = value;
            RaisePropertyChanged( nameof(LocationName));
        }
    }
    public string SubLocationName
    {
        get
        {        
            return _subLocationName;
        }
        set
        {
            _subLocationName = value;
            RaisePropertyChanged(nameof(SubLocationName));
        }
    }
    public string LocationCompleteString => $"{LocationName}/{SubLocationName}";

    private void MyClass_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == nameof(LocationName) || e.PropertyName == nameof(SubLocationName))
        {
            RaisePropertyChanged(nameof(LocationCompleteString));
        }
    }

    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
 

Xaml

 <StackPanel>
    <StackPanel.DataContext>
        <local:MyClass />
    </StackPanel.DataContext>
    <TextBlock x:Name="FullContent" Text="{Binding LocationCompleteString}" />
    <TextBox x:Name="Header" Text="{Binding LocationName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox x:Name="Footer" Text="{Binding SubLocationName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
 

Комментарии:

1. Я обновил свой пример проекта с изменениями, которые вы показали в коде ur, но он все еще не работает, я набираю текст в эти 2 текстовых поля на странице xaml, но они не обновляют текстовый блок «LocationCompleteString» прямо под ними.

2. Пожалуйста, перейдите в эту строку , замените ее на RaisePropertyChanged(nameof(LocationCompleteString));

3. да, ты прав, это все исправило, большое спасибо.