WPF:将对象存储在应用程序settings.settings文件中

时间:2018-12-29 16:47:04

标签: wpf settings.settings

我构建了一个简单的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 :(得分:0)

//可变创建

    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的相同代码,通过使代码隐藏类具有用于绑定Collection的DataContext。

    /// <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