我一直在寻找答案,但似乎没有一个适合我的问题。
我正在尝试采用 MvVM 方法,但是我认为我并不完全理解它。
我正在尝试在WPF中创建RPM显示。
我希望它显示一个数字(介于0-3000之间)并每秒更新一次此数字(转换为TextBlock
)。
我创建了一个新类,尝试在其中创建DispatcherTimer和Random生成器,然后将其放在UI TextBlock中。
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Threading;
namespace Aldeba.UI.WpfClient
{
public class GenerateRpm
{
public GenerateRpm()
{
DispatcherTimer timer = new DispatcherTimer
{
Interval = new TimeSpan(0, 0, 5)
};
timer.Start();
timer.Tick += Timer_Tick;
}
public int RandomValue()
{
Random random = new Random();
int RandomRpm = random.Next(0, 3001);
return RandomRpm;
}
void Timer_Tick(object sender, EventArgs e)
{
MainWindow mainWindow = new MainWindow();
GenerateRpm rpm = new GenerateRpm();
mainWindow.RpmDisplayLabel.Text = rpm.RandomValue().ToString();
}
}
}
我的MainWindow.xaml.cs看起来像...
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
this.DataContext = new GenerateRpm();
}
}
}
我是否需要向要访问的所有类添加datacontext(例如用于绑定)?
这是MainWindow,我希望Rpm显示在第二个TextBlock
中。
<StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center">
<TextBlock Text="RPM:" Style="{StaticResource RpmDisplay}" />
<TextBlock x:Name="RpmDisplayLabel" Text="{Binding }" Style="{StaticResource RpmDisplay}" />
</StackPanel>
我想做些什么和/或做错了什么?
答案 0 :(得分:1)
使用如下所示的视图模型,该模型具有由计时器周期性更新的公共属性。
确保属性设置器触发更改通知,例如INotifyPropertyChanged接口的PropertyChanged
事件。
public class MainWindowViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private readonly Random random = new Random();
public MainWindowViewModel()
{
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
timer.Tick += Timer_Tick;
timer.Start();
}
private int randomRpm;
public int RandomRpm
{
get { return randomRpm; }
set
{
randomRpm = value;
PropertyChanged?.Invoke(
this, new PropertyChangedEventArgs(nameof(RandomRpm)));
}
}
private void Timer_Tick(object sender, EventArgs e)
{
RandomRpm = random.Next(0, 3001);
}
}
将视图模型类的实例分配给MainWindow的DataContext:
public MainWindow()
{
InitializeComponent();
DataContext = new MainWindowViewModel();
}
在视图中,将元素绑定到视图模型属性:
<TextBlock Text="{Binding RandomRpm}"/>