MVVM

在WPF框架中使用MVVM(Model-View-ViewModel)设计模式来构建一个显示不同地区时间的世界时钟应用,我们可以这样定义M、V、VM的职责:

Model (模型)

模型层负责处理数据和业务逻辑。在这个场景下,模型可能包括:

  • TimeZoneInfo 对象或自定义的时区类,用于存储时区信息和计算时间偏移。
  • 数据访问逻辑,如从系统或网络获取时区列表和当前时间。
  • 可能还包括一些数据转换逻辑,例如将UTC时间转换为特定时区的时间。

ViewModel (视图模型)

视图模型作为模型和视图之间的桥梁,它:

  • 暴露数据给视图进行绑定,例如每个时钟的显示时间和时区名称。
  • 包含命令,用于响应用户交互,如添加新的时钟或更改时区。
  • 跟踪和更新时钟的时间,可能通过定时器或其他机制定期调用。
  • 实现INotifyPropertyChanged接口,以便当数据改变时通知视图更新。

View (视图)

视图负责展示数据和接收用户输入,它:

  • 使用XAML定义界面布局,包括时钟的布局和样式。
  • 绑定到ViewModel提供的属性和命令,如时钟的时间和时区选择命令。
  • 可能会包含一些交互元素,如按钮来添加或删除时钟,以及下拉菜单来选择时区。

下面是一个简化的示例结构:

Model

1
2
3
4
5
public class TimezoneData 
{
public string Name { get; set; }
public TimeSpan Offset { get; set; }
}

ViewModel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class WorldClockViewModel : INotifyPropertyChanged 
{
private ObservableCollection<TimezoneData> _timezones;
public ObservableCollection<TimezoneData> Timezones
{
get => _timezones;
set
{
_timezones = value;
OnPropertyChanged(nameof(Timezones));
}
}
// 假设有一个方法来更新时钟的时间
private void UpdateClocks()
{
foreach (var timezone in Timezones)
{
timezone.Time = CalculateLocalTime(timezone.Offset);
}
}
// 其他属性和命令...
}

View

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- XAML --> 
<Grid>
<ListBox ItemsSource="{Binding Timezones}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<TextBlock Text=":" />
<TextBlock Text="{Binding Time, StringFormat={}{0:HH:mm:ss}}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>

这个结构确保了数据和UI的分离,使得代码更加模块化和易于维护。


MVVM
https://newztx.github.io/2024/07/24/MVVM/
作者
Cranky Dove
发布于
2024年7月24日
许可协议