Событие WinUI 3 PropertyChanged не срабатывает/обновляется. ФлажокC#

Место общения программистов C#
Ответить
Anonymous
 Событие WinUI 3 PropertyChanged не срабатывает/обновляется. Флажок

Сообщение Anonymous »

Я работаю над этой ошибкой в ​​приложении Winui 3. Как вы можете видеть в следующем примере кода, когда вы устанавливаете/снимаете флажок с «DefaultProgramCheckBox», вызывается SetValue переменной «DefaultProgram», но событие PropertyChanged не запускается и не фиксируется ProcessPropertyChanged() в ViewModel, есть идеи, что такое основная причина этой проблемы. Спасибо.
Вот флажок в пользовательском интерфейсе. (Страница).


Вот код в ViewModel.cs
//Main model
[ObservableProperty]
private ProgramWrapper _desktopWrapper = new(new Program());

public ViewModel()
{
LoadAsync();

PropertyChanged += ProcessPropertyChanged;
DesktopWrapper.PropertyChanged += ProcessPropertyChanged;

}

private void ProcessPropertyChanged(object sender, PropertyChangedEventArgs e)
{
//PropertyChangedEvent not captured here when check/uncheck the checkbox
if (e.PropertyName == nameof(DesktopWrapper.DefaultProgram))
ShowDefaultProgramMessage();
}

Вот ProgramWrapper.cs:
public class ProgramWrapper : ModelWrapper
{
public ProgramWrapper(Program model) : base(model)
{

}

public bool DefaultProgram
{
get { return GetValue(); }
set { SetValue(value); } //When check/check the checkbox, SetValue is called.
}
}
< /code>
здесь iss modelwrapper.cs: < /p>
public class ModelWrapper : NotifyDataErrorsInfoBase
{
public T Model { get; set; }
public ModelWrapper(T model)
{
Model = model;
}

protected virtual TValue GetValue(
[CallerMemberName] string propertyName = null)
{
return (TValue)typeof(T).GetProperty(propertyName).GetValue(Model);
}

protected virtual void SetValue(
TValue value,
[CallerMemberName] string propertyName = null)
{
typeof(T).GetProperty(propertyName).SetValue(Model, value);
OnPropertyChanged(propertyName);
ValidatePropertyInternal(propertyName, value);
}

private void ValidatePropertyInternal(string propertyName, object currentValue)
{
ClearErrors(propertyName);

ValidateDataAnnotations(propertyName, currentValue);

ValidateCustomErrors(propertyName);
}

private void ValidateCustomErrors(string propertyName)
{
var errors = ValidateProperty(propertyName);
if (errors != null)
{
foreach (var error in errors)
{
AddError(propertyName, error);
}
}
}

private void ValidateDataAnnotations(string propertyName, object currentValue)
{
var context = new ValidationContext(Model) { MemberName = propertyName };
var results = new List();

Validator.TryValidateProperty(currentValue, context, results);

foreach (var result in results)
{
AddError(propertyName, result.ErrorMessage);
}
}

protected virtual IEnumerable ValidateProperty(string propertyName)
{
return null;
}
}
< /code>
Здесь notifydataerrorsinfobase.cs: < /p>
public class NotifyDataErrorsInfoBase : ModelBase, INotifyDataErrorInfo
{
private Dictionary _errors =
new Dictionary();
public bool HasErrors => _errors.Any();

public event EventHandler ErrorsChanged;

public IEnumerable GetErrors(string propertyName)
{
return _errors.ContainsKey(propertyName) ?
_errors[propertyName] : null;
}

public Dictionary GetAllErrors()
{
return _errors;
}

protected virtual void OnErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
base.OnPropertyChanged(nameof(HasErrors));
}
protected void AddError(string propertyName, string error)
{
if (!_errors.ContainsKey(propertyName))
{
_errors[propertyName] = new List();
}
if (!_errors[propertyName].Contains(error))
{
_errors[propertyName].Add(error);
OnErrorsChanged(propertyName);
}
}
protected void ClearErrors(string propertyName)
{
if (_errors.ContainsKey(propertyName))
{
_errors.Remove(propertyName);
OnErrorsChanged(propertyName);
}
}

}


Подробнее здесь: https://stackoverflow.com/questions/793 ... g-checkbox
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»