Я работаю над проектом C# .NET 6.0 с WPF, и у меня есть следующий сценарий:
У меня есть два текстовых поля в моем приложении WPF:
<StackPanel>
<Label>Fee Percentage:</Label>
<TextBox Text = "{Binding ContractExtension.FeesPercentage, UpdateSourceTrigger=PropertyChanged}"></TextBox>
</StackPanel>
<StackPanel>
<Label>Amount in $</Label>
<TextBox Text = "{Binding FeesAmount, Mode=OneWay}" IsReadOnly = "True"></TextBox>
</StackPanel>
Значение второго текстового поля зависит от значения первого:
public class MainViewModel : BaseViewModel
{
private ContractExtension contractExtension;
public ContractExtension ContractExtension
{
get { return contractExtension; }
set
{
contractExtension = value;
OnPropertyChanged(nameof(ContractExtension));
OnPropertyChanged(nameof(FeesAmount));
}
}
public decimal FeesAmount
{
get
{
decimal feesAmount = Toolbox.GetContractGivenValue(contract, false) * ContractExtension.FeesPercentage / 100;
return feesAmount;
}
}
}
public abstract class BaseViewModel : INotifyPropertyChanged
{
#region Attributes
private Window parentWindow;
#endregion Attributes
#region Properties
public Window ParentWindow
{
get
{
return parentWindow;
}
set
{
parentWindow = value;
SetParentWindow(value);
}
}
public abstract void SetParentWindow(Window parentWindow);
public SearchBoxViewModel SearchBoxViewModel { get; }
#endregion Properties
public event PropertyChangedEventHandler? PropertyChanged;
public abstract void ResetData();
protected static ExceptionManager exceptionManager;
public BaseViewModel()
{
exceptionManager = new ExceptionManager();
SearchBoxViewModel = new SearchBoxViewModel();
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void RefreshProperty(string propertyName)
{
OnPropertyChanged(propertyName);
}
}
Однако когда я изменяю значение FeesPercentage, FeesAmount не обновляется в интерфейсе. ContractExtension — это модель сущности, а Toolbox.GetContractGivenValue — служебный метод, используемый для вычисления FeesAmount.
Вещи, которые я проверил:
ContractExtension реализовывалось INotifyPropertyChangedDataContextContractExtension вызывается при изменении FeesPercentage.Есть ли что-нибудь еще, что мне следует проверить или изменить в моем коде, чтобы FeesAmount правильно обновлялось в интерфейсе при FeesPercentage изменениях?
Чего я не понимаю, так это того, что везде в моем приложении я это сделал так, и это сработало, но здесь это не работает... Я отладил ContractExtension get,set, он входит в набор при инициализации, но всякий раз, когда я редактирую значение FeesPercentage в текстовом поле, это не запускает набор ContractExtension и, следовательно, не вызывает OnPropertyChanged(FeesAmount).
but whenever I edit the value of FeesPercentage in the textbox, it doesn't trigger the set of ContractExtension почему так должно быть? ты веришь, что это должно произойти автоматически?
«FeesAmount» будет использовать «FeesPercentage», а для реализации FeesPercentage требуется обработчик PropertyChanged (который затем вызывает изменение свойства в «FeesAmount»), о чем нет никаких свидетельств («изменение свойства» «родителя» ничего не делает). Также возникает вопрос об использовании TextBox «только для чтения», когда достаточно TextBlock. Наконец, вы можете убедиться, что «комиссия» в методе получения действительно имеет значение с помощью точки останова или отладочной записи.





Кажется, вам нужно будет сделать это:
public ContractExtension ContractExtension
{
get { return contractExtension; }
set
{
//remove event listener from previous instance
if (contractExtension is not null)
contractExtension.PropertyChanged -= ContractExtension_OnPropertyChanged;
contractExtension = value;
OnPropertyChanged(nameof(ContractExtension));
OnPropertyChanged(nameof(FeesAmount));
//listen to the propertychanged event of your contractExtension
contractExtension.PropertyChanged += ContractExtension_OnPropertyChanged;
}
}
private void ContractExtension_OnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
//trigger FeesAmount if FeesPercentage changes
if (args.PropertyName == nameof(ContractExtension.FeesPercentage))
OnPropertyChanged(nameof(FeesAmount));
}
Почему
ContractExtension.FeesPercentageно толькоFeesAmountтак не должно бытьContractExtension.FeesAmount?!?