Загрузка и привязка сериализованной модели представления к окну WPF? - PullRequest
1 голос
/ 17 марта 2010

Я пишу однооконный интерфейс для простого инструмента ETL. Пользовательский интерфейс состоит из окна, кода для окна, модели представления для окна и бизнес-логики. Я хотел предоставить пользователям функциональность для сохранения состояния пользовательского интерфейса, потому что содержимое около 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 Ответ

2 голосов
/ 17 марта 2010

Предполагая, что ваше событие loadState_Click находится в коде окна, вы можете попробовать это.

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