我有一个名为 NewCalibrationView.xaml/.cs 的视图,它有一个 ViewModel NewCalibrationViewModel.cs
视图的 xml:
<StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Left" >
<Label Content="Run Time:" FontSize="16" FontWeight="Bold" Margin="10,0,0,0"/>
<TextBlock Name="ClockTextBlock" Text="00:00:00:00" FontSize="16" Foreground="Red" Margin="5" FontWeight="Bold"/>
</StackPanel>
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Right">
<Label Content="Sample Count:" FontSize="16" FontWeight="Bold" Margin="10,0,0,0"/>
<TextBlock Text="0" Name="SampleCountDigit" Foreground="Red" FontSize="16" FontWeight="Bold" Margin="5"/>
</StackPanel>
正如人们所看到的,我有一个显示各种秒表的 TextBlock,目前运行秒表的代码在视图后面的代码中(NewCalibrationView.cs)
public partial class NewCalibrationView: UserControl
{
private DispatcherTimer dt = new DispatcherTimer();
private Stopwatch stopWatch = new Stopwatch();
private string _currentTime = string.Empty;
private int _sampleCount = 0;
public NewCalibrationView()
{
InitializeComponent();
dt.Tick += new EventHandler(dt_Tick);
dt.Interval = new TimeSpan(0, 0, 0, 0, 1);
}
private void dt_Tick(object sender, EventArgs e)
{
if (stopWatch.IsRunning)
{
TimeSpan ts = stopWatch.Elapsed;
_currentTime = String.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
ClockTextBlock.Text = _currentTime;
if (ts.Seconds%8 == 0)
{
_sampleCount++;
SampleCountDigit.Text = _sampleCount.ToString();
}
}
}
private void StartButton_Click(object sender, RoutedEventArgs e)
{
ClockTextBlock.Foreground = Brushes.Green;
stopWatch.Start();
dt.Start();
}
因为此代码直接在dt.Tick();
DispatchTimer 的 Tick 事件的事件处理程序 ( ) 中更新视图,所以我很难弄清楚代码隐藏中的内容以及 ViewModel 中的内容。
鉴于我在此处显示的代码隐藏代码,视图中应该包含哪些内容以及 ViewModel 中应该包含哪些内容?
首先,我认为 StartButton_Click() 应该转换为命令(我通常将其放入 VM 中),但如果是这种情况,那么仅这样做意味着我必须将 DispatchTimer 的声明和秒表也进入 VM,这意味着其余代码(事件处理程序、其注册等)必须在 VM 中。
这听起来对吗?