#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. да, ты прав, это все исправило, большое спасибо.