如何为应用程序设置单个对象实例?
How to set up a single object instance for an application?
我正在为我的应用程序遵循 MVVM 模式,为了防止内存泄漏,我需要将对象实例的数量减少到一个。然后应在需要时将此对象实例交给另一个 类。
在我当前的实现中,实例正在 AppVM 中设置,并传递给 AdductionAbductionFlexionViewModel
。但是通过搜索 MyoDeviceModle()
实例,第二个实例显示在 AdductionAbductionFlexionView
.
中
我的问题是如何在 AdductionAbductionFlexionView
中设置构造函数以获取在整个应用程序中使用的 _connectedDevice
实例?
这是显示应该使用的主要且唯一实例的 AppVM:
private MyoDeviceModel _connectedDevice;
#endregion
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationViewModel"/> class.
/// </summary>
public ApplicationViewModel()
{
_connectedDevice = new MyoDeviceModel();
// Add available pages
PageViewModels.Add(new HomeViewModel(new UserLoginModel()));
PageViewModels.Add(new AdductionAbductionFlexionViewModel(_connectedDevice, new DatabaseModel()));
// Set starting page
CurrentPageViewModel = PageViewModels[0];
}
这就是它传递给 AdductionAbductionFlexionViewModel
的方式:
私有 MyoDeviceModel _myoDevice;
私有数据库模型_dataObj;
public event Action<string> DataChanged;
private string _itemString;
/// <summary>
/// Initializes a new instance of the <see cref="AdductionAbductionFlexionViewModel"/> class.
/// </summary>
/// <param name="Myodevice">The device.</param>
/// <param name="progressData">The progress data.</param>
public AdductionAbductionFlexionViewModel(MyoDeviceModel Myodevice, DatabaseModel progressData)
{
DataSubmitCommand = new RelayCommand (this.SaveChangesToPersistence);
CalibrationSetCommand = new RelayCommand(this.CallibratePitchMinimumCall);
DatabaseSearchCommand = new RelayCommand(this.QueryDataFromPersistence);
_myoDevice = Myodevice;
_myoDevice.MyoDeviceStart();
_dataObj = progressData;
_myoDevice.StatusUpdated += (update) =>
{
CurrentStatus = update;
};
_myoDevice.PoseUpdated += (update) =>
{
PoseStatus = update;
};
_myoDevice.PainfulArcDegreeUpdated += (update) =>
{
PainfulArcStatus = update;
};
_myoDevice.DegreesUpdated += (update) =>
{
DegreeStatus = update;
};
_myoDevice.StartDegreeUpdated += (update) =>
{
StartDegreeStatus = update;
};
_myoDevice.EndDegreeUpdated += (update) =>
{
EndDegreeStatus = update;
};
}
但我想知道如何传递 _connectedDevice
实例而不是 new MyoDeviceModel()
public AdductionAbductionFlexionView()
{
InitializeComponent();
this.DataContext = new AdductionAbductionFlexionViewModel(new MyoDeviceModel(), new DatabaseModel());
this.Loaded += AdductionAbductionFlexionView_Loaded;
this.Loaded -= AdductionAbductionFlexionView_Loaded;
((AdductionAbductionFlexionViewModel)DataContext).DataChanged += x =>
{
new ToastPopUp("Submit Succeeded!", "Progress data submitted succesfully", NotificationType.Information)
{
Background = new LinearGradientBrush(System.Windows.Media.Color.FromRgb(0, 189, 222), System.Windows.Media.Color.FromArgb(255, 10, 13, 248), 90),
BorderBrush = new SolidColorBrush(System.Windows.Media.Color.FromRgb(0, 189, 222)),
FontColor = new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 255))
}.Show();
};
}
您正在将初始实例传递给另一个 class 的构造函数。因此,您只使用一个实例而不是两个。如果您不想传递实例,则需要考虑实现 Singleton Pattern.
我正在为我的应用程序遵循 MVVM 模式,为了防止内存泄漏,我需要将对象实例的数量减少到一个。然后应在需要时将此对象实例交给另一个 类。
在我当前的实现中,实例正在 AppVM 中设置,并传递给 AdductionAbductionFlexionViewModel
。但是通过搜索 MyoDeviceModle()
实例,第二个实例显示在 AdductionAbductionFlexionView
.
我的问题是如何在 AdductionAbductionFlexionView
中设置构造函数以获取在整个应用程序中使用的 _connectedDevice
实例?
这是显示应该使用的主要且唯一实例的 AppVM:
private MyoDeviceModel _connectedDevice;
#endregion
/// <summary>
/// Initializes a new instance of the <see cref="ApplicationViewModel"/> class.
/// </summary>
public ApplicationViewModel()
{
_connectedDevice = new MyoDeviceModel();
// Add available pages
PageViewModels.Add(new HomeViewModel(new UserLoginModel()));
PageViewModels.Add(new AdductionAbductionFlexionViewModel(_connectedDevice, new DatabaseModel()));
// Set starting page
CurrentPageViewModel = PageViewModels[0];
}
这就是它传递给 AdductionAbductionFlexionViewModel
的方式:
私有 MyoDeviceModel _myoDevice; 私有数据库模型_dataObj;
public event Action<string> DataChanged;
private string _itemString;
/// <summary>
/// Initializes a new instance of the <see cref="AdductionAbductionFlexionViewModel"/> class.
/// </summary>
/// <param name="Myodevice">The device.</param>
/// <param name="progressData">The progress data.</param>
public AdductionAbductionFlexionViewModel(MyoDeviceModel Myodevice, DatabaseModel progressData)
{
DataSubmitCommand = new RelayCommand (this.SaveChangesToPersistence);
CalibrationSetCommand = new RelayCommand(this.CallibratePitchMinimumCall);
DatabaseSearchCommand = new RelayCommand(this.QueryDataFromPersistence);
_myoDevice = Myodevice;
_myoDevice.MyoDeviceStart();
_dataObj = progressData;
_myoDevice.StatusUpdated += (update) =>
{
CurrentStatus = update;
};
_myoDevice.PoseUpdated += (update) =>
{
PoseStatus = update;
};
_myoDevice.PainfulArcDegreeUpdated += (update) =>
{
PainfulArcStatus = update;
};
_myoDevice.DegreesUpdated += (update) =>
{
DegreeStatus = update;
};
_myoDevice.StartDegreeUpdated += (update) =>
{
StartDegreeStatus = update;
};
_myoDevice.EndDegreeUpdated += (update) =>
{
EndDegreeStatus = update;
};
}
但我想知道如何传递 _connectedDevice
实例而不是 new MyoDeviceModel()
public AdductionAbductionFlexionView()
{
InitializeComponent();
this.DataContext = new AdductionAbductionFlexionViewModel(new MyoDeviceModel(), new DatabaseModel());
this.Loaded += AdductionAbductionFlexionView_Loaded;
this.Loaded -= AdductionAbductionFlexionView_Loaded;
((AdductionAbductionFlexionViewModel)DataContext).DataChanged += x =>
{
new ToastPopUp("Submit Succeeded!", "Progress data submitted succesfully", NotificationType.Information)
{
Background = new LinearGradientBrush(System.Windows.Media.Color.FromRgb(0, 189, 222), System.Windows.Media.Color.FromArgb(255, 10, 13, 248), 90),
BorderBrush = new SolidColorBrush(System.Windows.Media.Color.FromRgb(0, 189, 222)),
FontColor = new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 255))
}.Show();
};
}
您正在将初始实例传递给另一个 class 的构造函数。因此,您只使用一个实例而不是两个。如果您不想传递实例,则需要考虑实现 Singleton Pattern.