与 C# WPF MVVM 相关,如何在“视图”中绑定 TexBox.Text,并更改“模型”文件中字符串的内容?

问题描述 投票:0回答:1

我正在使用 C#、WPF、MVVM 迈出第一步。我正在尝试实现一个简单的串行终端。我实际上已经快完成了。我可以单击 MainView 中的按钮,还可以评估组合框中的值以选择正确的接口。到目前为止,整个事情在 MVVM 模型中运行得非常好。但在最后一步中,我在从“模型”通过“视图模型”到“视图”接收串行数据时遇到问题。对我来说,不清楚如何实施它。我使用“CommunityToolkit.Mvvm”来实现。

我的文件是:

  • 模型/串行接口.cs
  • ViewModel/MainViewModel.cs
  • 视图/MainWindow.xaml

模型文件的开头如下所示:

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,所以我还是个初学者。

我不确定在模型或视图模型中实现串行接口是否正确?

顺便说一句:我可以毫无问题地发布我的所有代码,但我不确定它是否有帮助。

c# mvvm binding textbox
1个回答
0
投票

从您发布的内容来看,您正在绑定

MainViewModel.TerminalTest
,假设您已将
MainViewModel
设置为查看数据上下文,但您尚未设置它。 相反,您似乎正在设置
SerialInterface.terminalContent
,如

所示
private void FillTerminalContent()
{
  terminalContent += dataIN.ToString();
  terminalContent += "\n";
}

您需要设置

MainViewModel.TerminalTest
才能触发通知事件。

我建议您在

MainViewModel
中放置一个事件处理程序或委托,以设置当数据从串行端口到达时触发的
TerminalText

© www.soinside.com 2019 - 2024. All rights reserved.