学习任重道远啊 2024-04-02 11:14 采纳率: 65.2%
浏览 18
已结题

MVVM模式中textBox控件问题,求解答

问题:使用textbox控件,消息总是在第一行显示

描述:使用了WPF的mvvm(Prism)模式进行设计的,然后textBox进行了数据绑定
textbox的xaml代码如下:

<TextBox x:Name="textBoxLog" HorizontalAlignment="Left" Margin="10,27,0,0" Grid.Row="6" TextWrapping="Wrap" Text="{Binding Log}" VerticalAlignment="Top" Width="499" VerticalContentAlignment="Top" HorizontalContentAlignment="Left" Grid.ColumnSpan="2" Height="62" Grid.RowSpan="2" VerticalScrollBarVisibility="Visible"/>

viewmodel类的代码如下:

public string Log
{
    get { return _log; }
    set { SetProperty(ref _log, value); }
}

然后我在viewmodel类中,写了一个方法:

 public void PrintLog(string Msg)
 {
     string smsg = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "   " + Msg + "\r\n";
     this.Log += smsg;
 }

这个方法我是用按钮去控制的,按钮按下的事件也是在viewmodel实现的,代码如下:

public void SendButtonClick()
{  
        this.PrintLog(string.Format("--->发  {0}", this.SendData)); 
}

因为采用mvvm模式,核心代码都不在主界面那边,因此也无法访问textBox ,所以无法使用ScrollToEnd()这个方法去让滚动条聚焦在最后一行

img

实在想不出来如何解决了,有大niu帮忙解答一波吗

  • 写回答

1条回答 默认 最新

  • 关注

    晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    在使用TextBox控件进行数据绑定时,如果希望消息始终显示在最后一行,可以通过在ViewModel中绑定一个附加属性,用于控制TextBox的滚动条位置。以下是一种可能的解决方案:
    1. 在ViewModel中添加一个附加属性,用于控制TextBox的滚动条位置:
    private bool _scrollToEnd;
    public bool ScrollToEnd
    {
        get { return _scrollToEnd; }
        set { SetProperty(ref _scrollToEnd, value); }
    }
    
    1. 在PrintLog方法中更新ScrollToEnd属性,以便在每次添加新消息时将滚动条位置设置为最后一行:
    public void PrintLog(string Msg)
    {
        string smsg = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "   " + Msg + "\r\n";
        this.Log += smsg;
        this.ScrollToEnd = true; // 设置滚动条位置为最后一行
    }
    
    1. 在XAML中绑定ScrollToEnd属性到TextBox的ScrollToEnd属性,以便在ScrollToEnd属性变化时自动将滚动条位置设置为最后一行:
    <TextBox x:Name="textBoxLog" HorizontalAlignment="Left" Margin="10,27,0,0" Grid.Row="6" TextWrapping="Wrap" Text="{Binding Log}" VerticalAlignment="Top" Width="499" VerticalContentAlignment="Top" HorizontalContentAlignment="Left" Grid.ColumnSpan="2" Height="62" Grid.RowSpan="2" VerticalScrollBarVisibility="Visible">
        <TextBox.Style>
            <Style TargetType="TextBox">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ScrollToEnd}" Value="True">
                        <Setter Property="ScrollToEnd" Value="True"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>
    

    通过以上步骤,每次调用PrintLog方法时,都会将滚动条位置设置为最后一行,确保新消息始终显示在TextBox的底部。希望这个解决方案对您有帮助!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月18日
  • 已采纳回答 4月10日
  • 创建了问题 4月2日

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)