gpt4 book ai didi

c# - INotifyPropertyChanged 和 BaseClass C# 上的属性

转载 作者:行者123 更新时间:2023-11-30 23:23:40 25 4
gpt4 key购买 nike

我正在使用 WPF 和 MVVM 模型。我有一个名为 ViewModelBase 的基本 View 模型类。它有一个名为 Config 的复杂类型的属性。我需要派生类才能数据绑定(bind)到 View 中的基类 Config 属性。

public class ViewModelBase : INotifyPropertyChanged
{
private Configuration _config;
public event PropertyChangedEventHandler PropertyChanged;

public Configuration Config
{
get { return _config; }
set
{
if(_config == null || !_config.Equals(value))
{
_config = value;
OnPropertyChanged(new PropertyChangedEventArgs("Config"));
}
}
}

public ViewModelBase()
{
}

public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if(PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
}

数据绑定(bind)似乎以读取能力工作,但是当在 OptionsView 中更改配置的属性时,更改不会反射(reflect)在配置本身中。有什么建议吗?

配置实现,每个请求。

    public class Configuration : IEquatable<Configuration>, INotifyPropertyChanged
{
private string _primaryUrl;
private string _secondaryUrl;
private DateTime _scheduledStart;
private DateTime _scheduledEnd;
private string _buffer;
private bool _isScheduleEnabled;
private int _logDays;
private int _retryDuration;
private int _maxRetryAttempts;
private string _registrationKey;
private string _email;

public string PrimaryURL
{
get { return _primaryUrl; }
set
{
if(_primaryUrl != value)
{
_primaryUrl = value;
OnPropertyChanged(new PropertyChangedEventArgs("PrimaryURL"));
}
}
}
public string SecondaryURL
{
get { return _secondaryUrl; }
set
{
if(_secondaryUrl != value)
{
_secondaryUrl = value;
OnPropertyChanged(new PropertyChangedEventArgs("SecondaryURL"));
}
}
}
public DateTime ScheduledStart
{
get { return _scheduledStart; }
set
{
if(_scheduledStart != value)
{
_scheduledStart = value;
OnPropertyChanged(new PropertyChangedEventArgs("ScheduledStart"));
}
}
}
public DateTime ScheduledEnd
{
get { return _scheduledEnd; }
set
{
if(_scheduledEnd != value)
{
_scheduledEnd = value;
OnPropertyChanged(new PropertyChangedEventArgs("ScheduledEnd"));
}
}
}
public string Buffer
{
get { return _buffer; }
set
{
if(_buffer != value)
{
_buffer = value;
OnPropertyChanged(new PropertyChangedEventArgs("Buffer"));
}
}
}
public bool IsScheduleEnabled
{
get { return _isScheduleEnabled; }
set
{
if(_isScheduleEnabled != value)
{
_isScheduleEnabled = value;
OnPropertyChanged(new PropertyChangedEventArgs("IsScheduleEnabled"));
}
}
}
public int LogDays
{
get { return _logDays; }
set
{
if(_logDays != value)
{
_logDays = value;
OnPropertyChanged(new PropertyChangedEventArgs("LogDays"));
}
}
}
public int RetryDuration
{
get { return _retryDuration; }
set
{
if(_retryDuration != value)
{
_retryDuration = value;
OnPropertyChanged(new PropertyChangedEventArgs("RetryDuration"));
}
}
}
public int MaxRetryAttempts
{
get { return _maxRetryAttempts; }
set
{
if(_maxRetryAttempts != value)
{
_maxRetryAttempts = value;
OnPropertyChanged(new PropertyChangedEventArgs("MaxRetryAttempts"));
}
}
}
public string RegistrationKey
{
get { return _registrationKey; }
set
{
if(_registrationKey != value)
{
_registrationKey = value;
OnPropertyChanged(new PropertyChangedEventArgs("RegistrationKey"));
}
}
}
public string Email
{
get { return _email; }
set
{
if(_email != value)
{
_email = value;
OnPropertyChanged(new PropertyChangedEventArgs("Email"));
}
}
}

public Configuration() { }

public event PropertyChangedEventHandler PropertyChanged;

public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if(PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
}

这是罪魁祸首之一:

<xctk:DateTimePicker Grid.Column="1" Value="{Binding Config.ScheduledStart}" Height="20" VerticalAlignment="Top"/>

最佳答案

INotifyPropertyChanged 实现仅直接应用于该类。因此,在您的情况下,是 ViewModelBase 类及其子类型。

在这种情况下,PropertyChangedEvent 是在 Config 属性的 setter 中引发的,因此无论何时设置 Config 属性(以及setter 被调用),事件被引发。

然而,这并不意味着当改变 Config 对象时,even 也会被引发。一般来说,情况并非如此。

为了在 Config 对象更改时引发事件,您必须将对象重新分配给 View 模型(再次调用 setter)。然而,当数据绑定(bind)到对象时,这不起作用。

更好的解决方案是让 Configuration 实现 INotifyPropertyChanged 接口(interface)本身。因此,当更改该对象中的属性时,也会引发一个事件。 WPF 还将为子对象识别这一点,因此它会自动工作。

关于c# - INotifyPropertyChanged 和 BaseClass C# 上的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38251116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com