Сохранение настроек в App.Config, используя ICommand или нет? - PullRequest
0 голосов
/ 21 марта 2012

Я играю с MVVM, узнавая все, что связано с паттерном.Первое приложение, которое я пишу, - это очень маленькое приложение, которое в основном отображает 2 параметра из App.Config.

Моя цель - иметь возможность писать в этот app.config при нажатии кнопки.

Моя проблема заключается в том, что я не знаю точно, как подключить команду, чтобы делегировать эту работу, или если это даже путь.

Мой App.configочень просто:

 <configuration>
  <appSettings>
    <add key="duration" value="100" />
    <add key="operators" value="10" />
  </appSettings>
</configuration>

Модель выглядит следующим образом:

    get
    {
        // try to parse the setting from the configuration file
        // if it fails return the default setting 0
        int durationSetting = 0;                
        Int32.TryParse(ConfigurationManager.AppSettings["duration"], out durationSetting);

        return durationSetting;
    }
    set
    {                
        var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        config.AppSettings.Settings.Remove("duration");
        config.AppSettings.Settings.Add("duration", Convert.ToString(value));
        ConfigurationManager.RefreshSection("appSettings");
        config.Save();       
    }
}

Итак, модель отвечает за фактический доступ к данным, это то, что мы хотим, верно?

Кроме того, у меня есть ViewModel (ViewModelBase реализует INotifyPropertyChanged):

public class SettingsViewModel : ViewModelBase 
{
    private Settings Settings { get; set; }

    private SaveCommand saveCommand = new SaveCommand();

    public ICommand SaveCommand
    {
        get
        {
            return saveCommand;
        }
    }

    public SettingsViewModel(Settings settings)
    {
        if (settings == null)
            throw new ArgumentNullException("Settings", "Settings cannot be null");
        Settings = settings;
    }

    public int Duration
    {
        get { return Settings.Duration; }
        set
        {
            if (Settings.Duration != value)
            {
                Settings.Duration = value;
                RaisePropertyChanged("Duration");
            }
        }
    }

Представление представляет собой xaml usercontrol, например,

public partial class MainWindow : Window
{
    public SettingsViewModel SettingsViewModel { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        Settings settings = new Settings();

        SettingsViewModel = new SettingsViewModel(settings);
    }
}

Наконец, есть SaveCommand, который реализуетICommand, который в основном пустой на данный момент.Я подключил команду к кнопке в представлении.

Но в основном, что теперь?Какой лучший способ справиться с сохранением значений?Является ли пример, над которым я работаю, слишком надуманным?

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Я бы порекомендовал использовать очень полезный MVVM Light инструментарий .

По сути, вы выставите открытое свойство ICommand, которое возвращает экземпляр RelayCommand:

private RelayCommand myCommand;

public ICommand MyCommand
{
    get
    {
        return this.myCommand;
    }
}

...

// in constructor of the view model:
this.myCommand = new RelayCommand(this.MyCommandImplementation);

...

private void MyCommandImplementation()
{
    // Save your parameters here from your model
}

Что-то странное в вашем коде состоит в том, что вы фактически уже сохранили свои настройки в установщике открытого свойства с именем Duration.Вместо этого вы можете (вместо того, чтобы сохранять при каждом изменении свойства) просто использовать закрытую переменную в вашей ViewModel:

private int duration;
public int Duration
{
    get { return this.duration; }
    set
    {
        if (this.duration != value)
        {
            this.duration = value;
            RaisePropertyChanged("Duration");
        }
    }
}

Поэтому, когда вы изменяете поле пользовательского интерфейса, связанное с вашим Durationсвойство, вы обновляете только приватное поле duration.Таким образом, вы сохраните его только в файле app.config в методе * 1016. *

private void MyCommandImplementation()
{
    this.Settings.Duration = this.Duration;
}

Также обратите внимание, что ваше управление Settings немного сложное (вы удаляете, а затем снова добавляете настройки,Зачем?).И последнее: по вашему мнению, вы в настоящее время используете само представление в качестве datacontext.Вместо этого вы должны указать свою ViewModel:

this.SettingsViewModel = new SettingsViewModel(settings);
this.DataContext = this.SettingsViewModel;

Кроме того, я не думаю, что ваша роль заключается в создании экземпляра вашей модели.Вместо этого я бы создал Settings из ViewModel.

0 голосов
/ 21 марта 2012

Все, что вам нужно сделать, это реализовать интерфейс ICommand в классе и установить свойство SaveCommand для экземпляра этого класса.Вы можете использовать некоторые сторонние командные классы, такие как DelegateCommand библиотеки prism или RelayCommand.Обратитесь к следующей веб-странице для примера реализации ICommand;http://weblogs.asp.net/fredriknormen/archive/2010/01/03/silverlight-4-make-commanding-use-lesser-code.aspx

тогда выполняемые действия должны быть зарегистрированы в команде;

this.SaveCommand= new SaveCommand((o) =>
        {
            //change the model
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...