C# 需要帮助将事件驱动代码划分为尊重MVVM模式的层吗

C# 需要帮助将事件驱动代码划分为尊重MVVM模式的层吗,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个名为NewCalibrationView.xaml/.cs的视图,它有一个ViewModel NewCalibrationViewModel.cs 视图的xaml: <StackPanel Grid.Column="0" Orientation="Horizontal" HorizontalAlignment="Left" > <Label Content="Run Time:" FontSize="16" FontWeight="Bold" Margin="1

我有一个名为NewCalibrationView.xaml/.cs的视图,它有一个ViewModel NewCalibrationViewModel.cs

视图的xaml:

<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>
因为这段代码直接在事件处理程序(
dt.Tick();
)中为DispatchTimer的Tick事件更新视图,所以我很难弄清楚在代码中留下什么,以及在ViewModel中放置什么

鉴于我在这里展示的代码背后的代码,视图中应该包含哪些内容,视图模型中应该包含哪些内容

首先,我认为StartButton_Click()应该被转换成一个命令(我通常把它放在VM中),但是如果是这样的话,那么仅仅这样做就意味着我必须把DispatchTimer和StopWatch的声明也放在VM中,这意味着剩下的代码(事件处理程序、其注册等)必须位于VM中


这听起来对吗?

如果是我,我会将其全部移动到视图模型。我会将2
TextBlock
Text
属性绑定到视图模型上的2个字符串。正如您所说,将
按钮
命令属性绑定到视图模型上的
ICommand
。此外,您还可以在视图模式上保留一个布尔属性l绑定到
文本块的颜色(需要数据触发器)如果是我,我会将其全部移动到视图模型。我会将2
TextBlock
Text
属性绑定到视图模型上的2个字符串。正如您所说,将
按钮
命令属性绑定到视图模型上的
ICommand
。此外,您还可以在视图模型上保留一个绑定到co的布尔属性您的<代码>文本块< /C> >(您需要数据触发器)

我会考虑使用MVVM工具包。我个人使用和喜欢MVVM轻工具包,但也有其他类似的。

我喜欢MVVM Light Toolkit的地方在于它易于使用、简单,并且附带了大量的文档和示例

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


我希望这有帮助。如果你需要更多的细节,请告诉我,我可以做出回应。

< P>我会考虑使用MVVM工具包。我个人使用和喜欢MVVM光工具包,但也有其他类似的。

我喜欢MVVM Light Toolkit的地方在于它易于使用、简单,并且附带了大量的文档和示例

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


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

数据触发器是指用户界面中的xaml在布尔值为真或假时响应标志?是的……您只需要为要更改颜色的
TextBlock
创建一个样式,该样式将具有有意义的DataTrigger。谢谢ou用于洞察和确认。所谓数据触发器,您是指UI中的xaml在布尔值为真或假时响应一个标志(如布尔值)?是的…您只需要为要更改颜色的
TextBlock
设置一个样式,该样式将具有有意义的DataTrigger。感谢您的洞察和确认。我有hea以前是工具包的rd,但由于害怕学习曲线,我避免使用它。我可能会使用它,因为我已经听过很多次了。+1尝试一下。你会很快启动并运行起来。这就是我喜欢它的原因。如果你充分使用它,它使用起来非常简单,功能强大。我以前听说过该工具包,但因为害怕而避免使用它学习曲线。我可能会使用它,因为我已经听过很多次了。+1尝试一下。你会很快启动并运行起来。这就是我喜欢它的地方。如果你充分使用它,它会非常简单和强大。
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();
    }