我正在使用 C#、WPF、MVVM 迈出第一步。我正在尝试实现一个简单的串行终端。我实际上已经快完成了。我可以单击 MainView 中的按钮,还可以评估组合框中的值以选择正确的接口。到目前为止,整个事情在 MVVM 模型中运行得非常好。但在最后一步中,我在从“模型”通过“视图模型”到“视图”接收串行数据时遇到问题。对我来说,不清楚如何实施它。我使用“CommunityToolkit.Mvvm”来实现。
我的文件是:
模型文件的开头如下所示:
namespace SimpleUART_1.Model
{
public class SerialInterface : ObservableObject
{
SerialPort uart = new SerialPort();
private string[] possibleComPorts;
private string CurrentComPort;
private string dataIN;
public string terminalContent;
...
进一步的方法:
private void uartDataReceived(object sender, SerialDataReceivedEventArgs e)
{
dataIN = uart.ReadLine();
Application.Current.Dispatcher.BeginInvoke((Action)FillTerminalContent);
}
private void FillTerminalContent()
{
terminalContent += dataIN.ToString();
terminalContent += "\n";
}
视图模型文件的开头如下所示:
namespace SimpleUART_1.ViewModel
{
public class MainViewModel : ObservableObject
{
// the viewmodel have to know the model.
private Model.SerialInterface serial;
public string TerminalText
{
get { return serial.terminalContent; }
set => SetProperty(ref serial.terminalContent, value);
}
最后,视图文件包含以下内容:
<Canvas Name="UARTTerminal" IsEnabled="True">
<!--Headline-->
<GroupBox x:Name="grbComPortControl" Height="109" Header="Com Port Control" Width="151" Canvas.Left="26" Canvas.Top="124" HorizontalAlignment="Left" VerticalAlignment="Center"/>
<!--Headline-->
<Label x:Name="lblHedline" Width="300" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center"
FontSize="20" FontWeight="Bold" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
Canvas.Left="250" Canvas.Top="0" Content="Simple IR-Box terminal" />
<Label x:Name="lblComPort" Content="COM PORT" HorizontalAlignment="Left" Margin="30,148,0,0" VerticalAlignment="Top"/>
<Label x:Name="label" Content="{Binding StatusText}" Height="20" Canvas.Left="104" Canvas.Top="207" Width="65" Background="{Binding StatusColor}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="9"/>
<ComboBox x:Name="cobComPort" HorizontalAlignment="Left" VerticalAlignment="Top" Width="65" Height="22" Canvas.Left="104" Canvas.Top="152" ItemsSource="{Binding GetAvailableComInterfaces}" />
<Button x:Name="btnReset" Content="Renew" HorizontalAlignment="Left" Margin="104,179,0,0" VerticalAlignment="Top" Width="65" Height="20" RenderTransformOrigin="-0.432,0.403" Command="{Binding RenewComPorts}" />
<Button x:Name="btnConnect" Content="Connect" HorizontalAlignment="Left" Margin="32,179,0,0" VerticalAlignment="Top" Width="65" Command="{Binding ConnectComPorts}" CommandParameter="{Binding SelectionBoxItem, ElementName=cobComPort}" />
<Button x:Name="btnDisconnect" Content="Disconnect" Width="65" Canvas.Left="32" Canvas.Top="207" HorizontalAlignment="Center" VerticalAlignment="Top" Command="{Binding DisconnectComPorts}" />
<GroupBox x:Name="grbReceiverTerminal" Height="180" Header="Receive Terminal" Width="271" Canvas.Left="239" Canvas.Top="80">
<TextBox x:Name="txbTerminal" HorizontalAlignment="Left" TextWrapping="Wrap" Width="257" Text="{Binding TerminalText}"/>
</GroupBox>
</Canvas>
正如我所写,除了文本框“txbTerminal”之外,所有东西都工作正常。当我通过串行接口收到某些内容时,文本框不会更新。当我为方法“FillTerminalContent”设置断点时,字符串“terminalContent”确实具有正确的内容。 我几周前才开始使用 C# WPF,所以我还是个初学者。
我不确定在模型或视图模型中实现串行接口是否正确?
顺便说一句:我可以毫无问题地发布我的所有代码,但我不确定它是否有帮助。
从您发布的内容来看,您正在绑定
MainViewModel.TerminalTest
,假设您已将 MainViewModel
设置为查看数据上下文,但您尚未设置它。
相反,您似乎正在设置 SerialInterface.terminalContent
,如 所示
private void FillTerminalContent()
{
terminalContent += dataIN.ToString();
terminalContent += "\n";
}
您需要设置
MainViewModel.TerminalTest
才能触发通知事件。
我建议您在
MainViewModel
中放置一个事件处理程序或委托,以设置当数据从串行端口到达时触发的 TerminalText
。