WPF: хранить объекты в файле settings.settings приложения - PullRequest
0 голосов
/ 29 декабря 2018

Я строю простой ClipboardManager, который содержит все последние элементы копирования.Итак, у меня есть этот простой ClipboardItem класс:

public class ClipboardItem : INotifyPropertyChanged
{
    private string _text { get; set; }
    private int _index { get; set; }

    public string Text
    {
        get { return _text; }
        set
        {
            _text = value;
            NotifyPropertyChanged();
        }
    }

    public int Index
    {
        get { return _index; }
        set
        {
            _index = value;
            NotifyPropertyChanged();
        }
    }

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

И мой ViewModel класс, который содержит ObservableCollection<ClipboardItem>:

public class ViewModel : INotifyPropertyChanged
{
    private ObservableCollection<ClipboardItem> _clipboards;

    public ViewModel()
    {
        if (_clipboards == null)
        {
            _clipboards = new ObservableCollection<ClipboardItem>();
            _clipboards.CollectionChanged += _clipboards_CollectionChanged;
        }
    }

    private void _clipboards_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        for (int i = 0; i < _clipboards.Count; i++)
            _clipboards[i].Index = i + 1;
    }

    public ObservableCollection<ClipboardItem> Clipboards
    {
        get { return _clipboards; }
        set
        {
            _clipboards = value;
            NotifyPropertyChanged();
        }
    }

    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Так что каждый Copy создает новый ClipboardItemобъект внутри списка, но когда я перезапускаю приложение, все записи исчезли, поэтому мне интересно, есть ли способ сохранить весь мой ClipboardItem объект в файле settings.settings приложения.

1 Ответ

0 голосов
/ 02 января 2019

// Создание переменной

    private string _dataFileName = @"ClipData.xml";
    DataTable _clipDataTable = new DataTable();

Внутри конструктора ViewModel.

public ViewModel()
{
    if (_clipboards == null)
    {
        _clipboards = new ObservableCollection<ClipboardItem>();
        _clipboards.CollectionChanged += _clipboards_CollectionChanged;

    }

        InitDataTable();
        ReadDataFile();
}

Создание новых методов

        /// <summary>
    /// Initialize Data Table considering you have only 1 column data.
    /// If you have more then you need to create more columns
    /// </summary>
    private void InitDataTable()
    {
        _clipDataTable = new DataTable();
        _clipDataTable.Columns.Add("ClipHeader");
        _clipDataTable.AcceptChanges();
    }

    //the clipboard Data is saved in xml file.
    private void WriteDataFile()
    {
        DataSet ClipDataSet = new DataSet();
        ClipDataSet.Tables.Add(_clipDataTable);
        ClipDataSet.WriteXml(_dataFileName);
    }

   // if file exits then read the xml file and add it to the Collection, which will be reflected in UI.
    private void ReadDataFile()
    {
        DataSet ClipDataSet = new DataSet();
        if (File.Exists(_dataFileName))
        {
            ClipDataSet.ReadXml(_dataFileName);

            foreach (DataRow item in ClipDataSet.Tables[0].Rows)
            {
                Clipboards.Add(new ClipboardItem { Text = Convert.ToString(item["ClipHeader"]) });
            }
        }
    }

Используя команду, вы можете привязать метод ViewModel кЗакрытие окна.Поэтому всякий раз, когда пользователь закрывает окно, данные в коллекции будут записываться в файл XML.

Данные из коллекции копируются в DataTable.

    private void WindowCloseCommadn(object o)
    {
        foreach (var item in Clipboards)
        {
            DataRow dataRow = _clipDataTable.NewRow();
            dataRow["ClipHeader"] = item.Text;
            _clipDataTable.Rows.Add(dataRow);
        }
        WriteDataFile();
    }

Обновление: -

Тот же код без ViewModel, так как класс codebehind имеет DataContext для привязки Collection.

    /// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    private ClipboardMonitor clipboardMonitor;
    private string _dataFileName = @"ClipData.xml";
    DataTable _clipDataTable = new DataTable();
    public ObservableCollection<ClipboardItem> Clipboards { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        Clipboards = new ObservableCollection<ClipboardItem>();
        Clipboards.CollectionChanged += Clipboards_CollectionChanged;

        Loaded += MainWindow_Loaded;
        InitiateClipboardMonitor();
        this.Closing += MainWindow_Closing1;
        this.DataContext = this;
    }

    private void MainWindow_Closing1(object sender, CancelEventArgs e)
    {
        foreach (var item in Clipboards)
        {
            DataRow dataRow = _clipDataTable.NewRow();
            dataRow["ClipHeader"] = item.Text;
            _clipDataTable.Rows.Add(dataRow);
        }
        WriteDataFile();
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        InitDataTable();
        ReadDataFile();
    }

    /// <summary>
    /// Initialize Data Table considering you have only 1 column data.
    /// If you have more then you need to create more columns
    /// </summary>
    private void InitDataTable()
    {
        _clipDataTable = new DataTable();
        _clipDataTable.Columns.Add("ClipHeader");
        _clipDataTable.AcceptChanges();
    }

    private void WriteDataFile()
    {
        DataSet ClipDataSet = new DataSet();
        ClipDataSet.Tables.Add(_clipDataTable);
        ClipDataSet.WriteXml(_dataFileName);
    }

    private void ReadDataFile()
    {
        DataSet ClipDataSet = new DataSet();
        if (File.Exists(_dataFileName))
        {
            ClipDataSet.ReadXml(_dataFileName);

            foreach (DataRow item in ClipDataSet.Tables[0].Rows)
            {
                Clipboards.Add(new ClipboardItem { Text = Convert.ToString(item["ClipHeader"]) });
            }
        }
    }

    private void Clipboards_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        for (int i = 0; i < Clipboards.Count; i++)
        {
            Clipboards[i].Index = i + 1;
        }
    }

    private void InitiateClipboardMonitor()
    {
        clipboardMonitor = new ClipboardMonitor();
        clipboardMonitor.OnClipboardContentChanged += ClipboardMonitor_OnClipboardContentChanged; ;
    }

    private void ClipboardMonitor_OnClipboardContentChanged(object sender, EventArgs e)
    {
        string clipboardText = Clipboard.GetText(TextDataFormat.Text);
        Clipboards.Add(new ClipboardItem { Text = clipboardText });
    }
}

Чтобы узнать о Command, обратитесь к статье

https://www.codeproject.com/Articles/274982/Commands-in-MVVM

...