2014-11-06 53 views
0

我試圖加載一個應用程序,該應用程序在點擊保存按鈕之前輸入的值已經崩潰。我從來沒有處理過緩存,也找不到許多有關WPF MVVM緩存的文檔。如果我可以得到一些幫助。爲應用程序緩存TextField

PersonViewModel:

public string FirstName {get; set;} 
public string LastName {get; set;} 

PersonView.xaml.cs

<TextBlock Text ="{Binding FirstName}"/> 
<TextBlock Text ="{Binding LastName}"/> 

例子,我分別進入比利·鮑伯·分成第一和姓氏,並在應用程序關閉或我的保存按鈕被觸發之前崩潰。

+2

這豈不是更好地使應用程序不會崩潰?否則,我猜你可以將重要信息寫入一個臨時文本文件,該文件在保存時會被清除。寫入註冊表是另一種選擇。 – noMad17 2014-11-06 20:58:02

+0

這不是非常重要的信息。相反,它被保存而不是被刪除。這是一個預防措施,只要他們關閉窗口也有*緩存的原因很多。 – Master 2014-11-06 21:02:41

+0

關閉和崩潰是不一樣的。您可以處理一個關閉事件。 – Paparazzi 2014-11-06 21:29:07

回答

1

如果您願意,當然可以「緩存」用戶輸入。 實現此目的的一種方法是在用戶輸入時持久保存數據。

如果您有簡單的MainWindow.xamlMainWindow.xaml.cs像這樣

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="30" /> 
    </Grid.RowDefinitions> 

    <StackPanel Grid.Row="0"> 
     <TextBox Text="{Binding User.FirstName, 
           Mode=TwoWay, 
           UpdateSourceTrigger=PropertyChanged}" /> 
     <TextBox Text="{Binding User.LastName, 
           Mode=TwoWay, 
           UpdateSourceTrigger=PropertyChanged}" /> 
    </StackPanel> 

    <Button Grid.Row="1" Content="Save" Command="{Binding SaveCommand}" /> 
</Grid> 

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new MainViewModel(); 
} 

然後使用您提供User模型,給予它實現INotifyPropertyChanged,你MainViewModel就應該像這樣

public class MainViewModel : ViewModelBase 
{ 
    // "cache" 
    private readonly Cache<User> _cache; 
    private SaveCommand _saveCommand; 

    public MainViewModel() 
    { 
     // if exist, deserialize data 
     _cache = new Cache<User>(); 
     User = _cache.Deserialize() ?? new User(); 

     // listen properties for changes, serialize 
     User.PropertyChanged += (sender, args) => _cache.Serialize(User); 

     // provide cache file name to save command 
     SaveCommand = new SaveCommand(_cache.File); 
     CommandManager.RegisterClassCommandBinding(
      typeof(MainViewModel), new CommandBinding(SaveCommand)); 
    } 

    private User _user; 
    public User User 
    { 
     get { return _user; } 
     set { _user = value; OnPropertyChanged(); } 
    } 

    public ICommand SaveCommand { get; private set; } 
} 

在上面的代碼中,如果存在,則將「緩存」的數據加載到viewmodel的屬性中。如果不是,只需傳入一個新實例。然後,在用戶類型時,所有更改都立即序列化(如XML)。

當執行SaveCommand時,該緩存被刪除。否則,無論用戶何時進入主窗口(無論應用程序是關閉還是崩潰),都是可用的。

Cache<T>以下,以及簡單的SaveCommand執行。

public class Cache<T> where T : new() 
{ 
    private readonly XmlSerializer _serializer = new XmlSerializer(typeof(T)); 
    private readonly string _file = string.Format("{0}.xml", typeof(T).Name); 

    public void Serialize(T obj) 
    { 
     using (var writer = XmlWriter.Create(_file)) 
      _serializer.Serialize(writer, obj); 
    } 

    public T Deserialize() 
    { 
     if (!System.IO.File.Exists(File)) 
      return default(T); 

     using (var reader = XmlReader.Create(_file)) 
      return (T) _serializer.Deserialize(reader); 
    } 

    public string File { get { return _file; } } 
} 

public class SaveCommand : ICommand 
{ 
    public event EventHandler CanExecuteChanged; 
    private readonly string _file; 

    public SaveCommand(string file) 
    { 
     _file = file; 
    } 

    public void Execute(object parameter) 
    { 
     Debug.WriteLine("Save logic here, maybe..."); 
     Debug.WriteLine(string.Format("...and remove cache file {0}", _file)); 
     File.Delete(_file); 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 
} 


下面是真是太神奇了UI的擷取畫面:)和相關的XML格式。

imgur

<?xml version="1.0" encoding="utf-8"?> 
<User xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <FirstName>My first...</FirstName> 
    <LastName>....and last name</LastName> 
</User>