Сохранение данных после изменения DataContext / Views в WPF - PullRequest
0 голосов
/ 09 ноября 2018

Я новичок в WPF и хочу создать приложение, которое будет осуществлять последовательную связь с моим драйвером, а из программы я могу установить значения для драйвера.

Мне удалось создать пользовательский интерфейс, как показано на рисунке здесь . Если я нажимаю синий вид, как указано стрелкой, вид моего окна выглядит как this . Если я нажимаю «Red View Option», то дисплей выглядит как this Кнопка настройки находится там, где стрелка указывает на верхний правый угол (под кнопкой закрытия окна), и при нажатии мое окно будет выглядеть как this .

В основном я изменяю содержимое BIG RECTANGLE в соответствии с кнопкой, которую я нажал, например (прямоугольник синий при нажатии на синий вид, прямоугольник заполнен красным, одна метка и кнопка для изменения метка при нажатии Red View)

Так что теперь моя проблема в том, что я не могу сохранить значение, которое я установил в этом БОЛЬШОМ ПЯТИЧНОМ после того, как я изменил содержимое этого БОЛЬШОГО ПЕРЕНОСА . Например, когда я нажал кнопку настройки и изменил настройку, например this , я готов к обмену данными в COM5, и можно нажать кнопку закрытия порта. Теперь, прежде чем закрыть порт, если я изменю вид BIG RECTANGLE , нажав Красный или Синий вид, затем после нажатия кнопки настройки, у меня больше нет этой возможности, чтобы закрыть порт, и так как я уже открыл порт com5 ранее, поэтому при попытке открыть порт он также выдаст ошибку.

Пожалуйста, помогите мне с этим. Мой обозреватель решений для Visual Studio выглядит следующим образом: this и Мой код в событии нажатия кнопки выглядит следующим образом:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void SerialPortOnOFFButton_Clicked(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("ON OFF Clicked");
        }

        private void SerialPortSettingButton_Clicked(object sender, RoutedEventArgs e)
        {
            DataContext = new SerialPortSettingView();
           
        }

        private void RedViewButton_Clicked(object sender, RoutedEventArgs e)
        {
            DataContext = new Redview();
        }

        private void BlueViewButton_Clicked(object sender, RoutedEventArgs e)
        {
            DataContext = new Blueview();
        }
    }

И мой Solution Explorer выглядит как this

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Если вы хотите просто закрыть свой порт, вы можете реализовать интерфейс IDisposable в вашем классе SerialPortSettingView следующим образом. Каждый раз, когда вы меняете DataContext с SerialPortSettingView, ваш порт будет закрыт.

public class SerialPortSettingView : IDisposable
{
    private FileStream _fileStream;

    public SerialPortSettingView()
    {
        _fileStream = new FileStream("somefile.txt", FileMode.Open);
    }

    public void Dispose()
    {
        _fileStream?.Close();
    }
}
0 голосов
/ 09 ноября 2018

Каждый раз, когда вы изменяете представление, вы создаете новый объект для установки 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 (скрыть заголовки), а затем создал бы каждое представление с сопровождающей моделью представления в качестве вкладок. Затем при каждом событии щелчка вы просто устанавливаете свойство .SelectedIndex для TabControl. Я бы создал MainWindowViewModel и установил DataContext MainWindow в конструктор:

    private MainWindowViewModel = new MainWindowViewModel();

    public MainWindow()
    {
        DataContext = _mainWindowViewModel;
    }

И поместите всю логику в MainWindowViewModel (вам нужно использовать команды). Использование кода позади - это не то, для чего предназначен WPF, вы можете прочитать об этом все здесь с хорошим руководством, которому нужно следовать - Руководство по MVVM

Я не хочу слишком усложнять вещи и наполнять вас слишком большим количеством информации за один раз, но если вы начнете делать вещи таким образом, будет лучше, надеюсь, это поможет.

...