C# 在WPF中更改DataContext/视图后保留数据
我是WPF新手,希望构建一个应用程序,它可以和我的驱动程序进行串行通信,并可以从程序中为驱动程序设置值 我已经成功地创建了一个UI,如图所示。如果我最后按箭头所指的蓝色视图,我窗口的视图如下。如果我按下红色视图选项,则显示如下 设置按钮是指向右上角(窗口关闭按钮下方)的箭头所在的位置,按下时,我的窗口将是这样的 基本上,我是根据我按下的按钮来更改大矩形的内容,例如(单击蓝色视图时,矩形为蓝色;单击红色视图时,矩形为红色;单击红色视图时,一个标签和一个更改标签的按钮) 因此,现在我的问题是,在更改此大矩形的内容后,我无法保留在此大矩形中设置的值。例如,当我按下设置按钮并更改设置时,就像我已准备好在COM5中进行通信一样,可以按下关闭端口的选项。现在,在关闭端口之前,如果我通过按下红色视图或蓝色视图来更改大矩形的视图,然后在按下设置按钮之后,我将不再有关闭端口的选项,因为我之前已经打开了com5端口,所以当我试着打开端口时,它也会给我错误信息 请帮我做这个。我的visual studio解决方案资源管理器看起来像,我在按钮单击事件中的代码如下所示:C# 在WPF中更改DataContext/视图后保留数据,c#,wpf,user-interface,datacontext,multiple-views,C#,Wpf,User Interface,Datacontext,Multiple Views,我是WPF新手,希望构建一个应用程序,它可以和我的驱动程序进行串行通信,并可以从程序中为驱动程序设置值 我已经成功地创建了一个UI,如图所示。如果我最后按箭头所指的蓝色视图,我窗口的视图如下。如果我按下红色视图选项,则显示如下 设置按钮是指向右上角(窗口关闭按钮下方)的箭头所在的位置,按下时,我的窗口将是这样的 基本上,我是根据我按下的按钮来更改大矩形的内容,例如(单击蓝色视图时,矩形为蓝色;单击红色视图时,矩形为红色;单击红色视图时,一个标签和一个更改标签的按钮) 因此,现在我的问题是,在更改
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有void SerialPortOnOFFButton_单击(对象发送方,路由目标)
{
MessageBox.Show(“打开/关闭单击”);
}
私有void SerialPortSettingButton_单击(对象发送方,路由目标)
{
DataContext=新的SerialPortSettingView();
}
私有void RedViewButton_单击(对象发送者,路由目标)
{
DataContext=新的Redview();
}
私有void blueview按钮已单击(对象发送者、路由目标)
{
DataContext=newblueview();
}
}
每次更改视图时,您都要创建一个新对象来设置DataContext,如果您将单个对象保留为私有字段,则只需将DataContext设置为以下值:
private SerialPortSettingView _serialPortSettingView;
private RedView _redView;
private BlueView _blueView;
public MainWindow()
{
_serialPortSettingView = new SerialPortSettingView();
_redView = new RedView();
_blueView = new BlueView();
InitializeComponent();
}
private void SerialPortOnOFFButton_Clicked(object sender, RoutedEventArgs e)
{
MessageBox.Show("ON OFF Clicked");
}
private void SerialPortSettingButton_Clicked(object sender, RoutedEventArgs e)
{
DataContext = _serialPortSettingView;
}
private void RedViewButton_Clicked(object sender, RoutedEventArgs e)
{
DataContext = _redview;
}
private void BlueViewButton_Clicked(object sender, RoutedEventArgs e)
{
DataContext = _blueview;
}
这样,当您在视图之间切换时,您将使用存储的版本,当您更改值时,它们将存储在该视图中
如果我使用这个解决方案,我会将ContentControl更改为TabControl(隐藏标题),然后创建每个视图,并附带一个ViewModel作为选项卡。然后,在触发每个单击事件时,只需设置TabControl的.SelectedIndex属性。我将创建一个MainWindowViewModel,并在构造函数中将MainWindow的DataContext设置为:
private MainWindowViewModel = new MainWindowViewModel();
public MainWindow()
{
DataContext = _mainWindowViewModel;
}
并将所有逻辑放在MainWindowViewModel中(您需要使用命令)。使用代码隐藏并不是WPF的目的,您可以在这里阅读所有内容,并提供一个很好的教程-
我不想让事情过于复杂,一次就给你带来太多的信息,但如果你开始这样做会更好,希望这会有所帮助。如果你只想关闭端口,你可以在
SerialPortSettingView
类中实现IDisposable
接口,就像这样。每次从serialportsetingview
更改DataContext
时,您的端口都将关闭
public class SerialPortSettingView : IDisposable
{
private FileStream _fileStream;
public SerialPortSettingView()
{
_fileStream = new FileStream("somefile.txt", FileMode.Open);
}
public void Dispose()
{
_fileStream?.Close();
}
}
窗口的DataContext不应包含视图。您可能会使用ContentControl,它根据DataContext中的视图模型实例使用不同的DataTemplates。看一看。您可能还想了解。谢谢您的回复,实际上我想学习和实现MVVM,但我是新手,无法解决问题,所以我想至少开始做点什么……同时,在解决方案中,您建议我将datacontext分配给私有字段(_serialPortSettingView)但是当我分配DataContext=new _serialportsetingview;_serialPortSettingView带有红线下划线,消息表示找不到类型或命名空间。我甚至尝试将字段公开,但仍然无法将数据上下文分配给对象的字段。请提供一些建议..抱歉,我已经删除了新的关键字,因为我想早些时候删除它!!非常感谢,它解决了我的问题。祝您玩得愉快:D.谢谢您的回复,实际上我正试图在SerialPortSettingView类的帮助下建立串行通信,然后保持连接打开,以便其他类(datacontext)可以使用它。。。。我当前的代码在这方面还可以,直到我第一次错误地打开了错误的端口并想要更改端口。在这种情况下,我无法关闭以前打开的端口(错误的端口)。