Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中更改DataContext/视图后保留数据_C#_Wpf_User Interface_Datacontext_Multiple Views - Fatal编程技术网

C# 在WPF中更改DataContext/视图后保留数据

C# 在WPF中更改DataContext/视图后保留数据,c#,wpf,user-interface,datacontext,multiple-views,C#,Wpf,User Interface,Datacontext,Multiple Views,我是WPF新手,希望构建一个应用程序,它可以和我的驱动程序进行串行通信,并可以从程序中为驱动程序设置值 我已经成功地创建了一个UI,如图所示。如果我最后按箭头所指的蓝色视图,我窗口的视图如下。如果我按下红色视图选项,则显示如下 设置按钮是指向右上角(窗口关闭按钮下方)的箭头所在的位置,按下时,我的窗口将是这样的 基本上,我是根据我按下的按钮来更改大矩形的内容,例如(单击蓝色视图时,矩形为蓝色;单击红色视图时,矩形为红色;单击红色视图时,一个标签和一个更改标签的按钮) 因此,现在我的问题是,在更改

我是WPF新手,希望构建一个应用程序,它可以和我的驱动程序进行串行通信,并可以从程序中为驱动程序设置值

我已经成功地创建了一个UI,如图所示。如果我最后按箭头所指的蓝色视图,我窗口的视图如下。如果我按下红色视图选项,则显示如下 设置按钮是指向右上角(窗口关闭按钮下方)的箭头所在的位置,按下时,我的窗口将是这样的

基本上,我是根据我按下的按钮来更改大矩形的内容,例如(单击蓝色视图时,矩形为蓝色;单击红色视图时,矩形为红色;单击红色视图时,一个标签和一个更改标签的按钮)

因此,现在我的问题是,在更改此大矩形的内容后,我无法保留在此大矩形中设置的值。例如,当我按下设置按钮并更改设置时,就像我已准备好在COM5中进行通信一样,可以按下关闭端口的选项。现在,在关闭端口之前,如果我通过按下红色视图或蓝色视图来更改大矩形的视图,然后在按下设置按钮之后,我将不再有关闭端口的选项,因为我之前已经打开了com5端口,所以当我试着打开端口时,它也会给我错误信息

请帮我做这个。我的visual studio解决方案资源管理器看起来像,我在按钮单击事件中的代码如下所示:

公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有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)可以使用它。。。。我当前的代码在这方面还可以,直到我第一次错误地打开了错误的端口并想要更改端口。在这种情况下,我无法关闭以前打开的端口(错误的端口)。