C# 我不知道如何在Viewmodel中集成我的模型
我正在使用Wpf、CaliburnMicro和mvvm模式构建一个小型个人项目。 该应用程序是一个触摸屏,允许用户查看室温,并允许用户选择空调器通风、冷、热、关的顺序,并显示该顺序是否已从空调器确认。反馈顺序。来自气候发生器的数据来自串行通信。 我有一个ClimControlModel类,它封装了诸如室温、顺序和反馈顺序等数据 我简化了ClimControl类,这样代码就不会占用StackOverflow上太多的行,我只想在视图中显示RoomTemperature ClimControlModel.cs:C# 我不知道如何在Viewmodel中集成我的模型,c#,mvvm,caliburn.micro,C#,Mvvm,Caliburn.micro,我正在使用Wpf、CaliburnMicro和mvvm模式构建一个小型个人项目。 该应用程序是一个触摸屏,允许用户查看室温,并允许用户选择空调器通风、冷、热、关的顺序,并显示该顺序是否已从空调器确认。反馈顺序。来自气候发生器的数据来自串行通信。 我有一个ClimControlModel类,它封装了诸如室温、顺序和反馈顺序等数据 我简化了ClimControl类,这样代码就不会占用StackOverflow上太多的行,我只想在视图中显示RoomTemperature ClimControlMode
namespace WpfMetroCaliburn.Models
{
public enum OrderValue
{
OFF,
VENT1,
VENT2,
VENT3,
COLD,
HOT,
OFFLINE
}
public class ClimControlModel
{
public float RoomTemperature { get; set; } = 99F; // fake value for testing
public OrderValue Order { get; set; }
public OrderValue FeedbackOrder { get; set; }
public ClimControlModel()
{
// will change val of RoomTemperature and FeedcackOrder every 5 seconds
ChangePropretiesPeriodically();
}
// this will simulate updating datas from Serial
public void ChangePropretiesPeriodically()
{
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnPropretiesChangeTimerEvent);
aTimer.Interval = 5000;
aTimer.Enabled = true;
}
// Assigning random values to RoomTemperature and Feedback Order for testing purposes
private void OnPropretiesChangeTimerEvent(object sender, ElapsedEventArgs e)
{
Array values = Enum.GetValues(typeof(OrderValue));
Random random = new Random();
FeedbackOrder = (OrderValue)values.GetValue(random.Next(values.Length));
Random rnd = new Random();
RoomTemperature = rnd.Next(20, 33);
Console.WriteLine($"FakeClimControlModel: RoomTemperature is now: {RoomTemperature}");
}
}
}
ShellViewModel:
namespace WpfMetroCaliburn.ViewModels
{
public class ShellViewModel : Screen
{
private ClimControlModel _clim;
public ClimControlModel Clim
{
get { return _clim; }
set {
_clim = value;
NotifyOfPropertyChange(() => Clim);
}
}
public ShellViewModel()
{
Clim = new ClimControlModel();
}
}
}
Xaml:
我理解它不起作用,因为ClimControlModel的实例实际上不会触发NotifyOfPropertyChange,因为对象本身没有改变,而是对象属性的值改变了。
但是,如果我在ViewModel中创建了RoomTemperature、Order、Feedback Order属性,那么最好的做法是什么?如何在ViewModel中自动更改它们的值?因为模型的属性正在更改,视图注意到更改的唯一方法是模型实现INotifyPropertyChanged,并在属性更改时引发NotifyPropertyChanged 换句话说,对于模型中的每个特性,请更改此样式:
public float RoomTemperature { get; set; }
到
如果您在ViewModel中添加了类似的属性,则在模型更改时不会通知它们
另一种方法是ViewModel订阅计时器事件,然后引发NotifyPropertyChanged事件。它可以工作,谢谢!对不起,我没有足够的理由支持你的回答。
public float RoomTemperature { get; set; }
private float roomTemperature;
public float RoomTemperature
{
get => this.roomTemperature;
set
{
this.roomTemperature=value;
this.NotifyPropertyChanged();
}
}