2

我有一个名为 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 中。

这听起来对吗?

4

2 回答 2

3

如果是我,我会将其全部移至视图模型。我会在我的视图模型上绑定 2 到 2 个字符串的Text属性。TextBlock正如你所说,将Button命令属性绑定到ICommand你的视图模型上。此外,您可以在视图模型上保留一个布尔属性,该属性绑定到您的颜色TextBlock(您需要数据触发器)

于 2013-04-18T19:21:21.840 回答
1

我会考虑使用 MVVM 工具包。我个人使用并更喜欢 MVVM Light Toolkit,但还有其他类似的。

我喜欢 MVVM Light Toolkit 的地方在于它易于使用、简单,并带有出色的文档和示例。

一旦您使用 MVVM 建立,然后将您的命令、文本元素绑定到您的 ViewModel。然后,您可以在 ViewModel 中处理您的事件。只需将您的命令绑定视为一个事件。

我希望这会有所帮助。如果您需要更多详细信息,请告诉我,我可以回复。

于 2013-04-19T01:01:50.770 回答