将序列化视图模型加载并绑定到WPF窗口?

时间:2010-03-17 02:01:15

标签: wpf binding viewmodel serialization

我正在为一个简单的ETL工具编写一个单窗口UI。 UI由窗口,窗口背后的代码,窗口的视图模型和业务逻辑组成。我想为用户提供保存UI状态的功能,因为大约10-12个文本框的内容将在会话之间重用,但特定于用户。我想我可以序列化视图模型,其中包含来自文本框的所有数据,这很好用,但是我无法将序列化XML文件中的信息加载回文本框。

窗口构造函数:

    public ETLWindow()
    {
        InitializeComponent();

        _viewModel = new ViewModel();

        this.DataContext = _viewModel;
        _viewModel.State = Constants.STATE_IDLE;

        Loaded += new RoutedEventHandler(MainWindow_Loaded);
    }

XAML:

<TextBox x:Name="targetDirectory" 
         IsReadOnly="true"
         Text="{Binding TargetDatabaseDirectory, UpdateSourceTrigger=PropertyChanged}"/>

ViewModel对应的属性:

    private string _targetDatabaseDirectory;
    [XmlElement()]
    public string TargetDatabaseDirectory
    { 
        get { return _targetDatabaseDirectory; }
        set { _targetDatabaseDirectory = value; OnPropertyChanged(DataUtilities.General.Utilities.GetPropertyName(() => new ViewModel().TargetDatabaseDirectory)); }

在代码中加载事件:

    private void loadState_Click(object sender, RoutedEventArgs e)
    {
        string statePath = this.getFilePath();
        _viewModel = ViewModel.LoadModel(statePath);
    }

正如您所猜测的,LoadModel方法反序列化用户驱动器上的序列化文件。

我在网上找不到这个问题。我知道这可能与我的绑定有关。在反序列化视图模型后,是否有某种方法可以刷新XAML上的绑定?或者可能刷新视图模型上的所有属性?或者我完全疯了以为可以做到这一点吗?

感谢。

1 个答案:

答案 0 :(得分:2)

假设你的loadState_Click事件在后面的Window代码上,你可以试试这个。

private void loadState_Click(object sender, RoutedEventArgs e) 
{ 
    string statePath = this.getFilePath(); 
    this.DataContext = ViewModel.LoadModel(statePath); 
}