Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <ComboBox ItemsSource="{Binding Settings}" DisplayMemberPath="Name"
- SelectedItem="{Binding SelectedSetting}" />
- public ObservableCollection<UserSettings> Settings { get; set; }
- private UserSettings _selectedSetting;
- public UserSettings SelectedSetting
- {
- get => _selectedSetting;
- set
- {
- _selectedSetting = value;
- OnPropertyChanged("SelectedSetting");
- OnPropertyChanged("UserStringSettingsHandler");
- OnPropertyChanged("UserSlideSettingsHandler");
- }
- }
- public UserSettingsViewModelHandler<string> UserStringSettingsHandler { get; set; }
- public UserSettingsViewModelHandler<SlideSettings> UserSlideSettingsHandler { get; set; }
- public class ApplicationSettingsViewModelHandler<TReturnType> : AbstractApplicationSettingsViewModelHandler<AppSettings, TReturnType>, INotifyPropertyChanged
- {
- public ApplicationSettingsViewModelHandler(AppSettings settings) : base(settings)
- {
- }
- }
- public class UserSettingsViewModelHandler<TReturnType> : AbstractApplicationSettingsViewModelHandler<UserSettings, TReturnType>, INotifyPropertyChanged
- {
- public UserSettingsViewModelHandler(UserSettings settings) : base(settings)
- {
- }
- }
- public abstract class AbstractApplicationSettingsViewModelHandler<TSettingsType, TReturnType> : INotifyPropertyChanged
- {
- private TSettingsType _settings;
- public event PropertyChangedEventHandler PropertyChanged;
- public AbstractApplicationSettingsViewModelHandler(TSettingsType settings)
- {
- _settings = settings;
- _values = new Dictionary<string, TReturnType>();
- MapSettings();
- PropertyChanged += OnApplicationSettingsChanged;
- }
- private void MapSettings()
- {
- var settingsType = typeof(TSettingsType);
- var properties = settingsType.GetProperties().Where(prop => prop.CanRead && prop.CanWrite);
- foreach(var prop in properties)
- {
- try
- {
- if (prop.GetValue(_settings) is TReturnType val)
- {
- this[prop.Name] = val;
- }
- } catch(TargetParameterCountException) { }
- }
- }
- private Dictionary<string, TReturnType> _values;
- public TReturnType this[string key]
- {
- get => _values[key];
- set
- {
- _values[key] = value;
- OnPropertyChanged(key);
- }
- }
- private void OnApplicationSettingsChanged(object sender, PropertyChangedEventArgs args)
- {
- if (!_values.ContainsKey(args.PropertyName))
- return;
- var settingsType = typeof(TSettingsType);
- var property = settingsType
- .GetProperties()
- .Where(prop => prop.CanRead && prop.CanWrite)
- .FirstOrDefault(prop => prop.Name == args.PropertyName);
- if(property != null)
- {
- property.SetValue(_settings, this[args.PropertyName], null);
- AppSettings.Default.Save();
- }
- }
- public void OnPropertyChanged(string propertyName)
- {
- PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
- }
- }
- public ReportingWindowViewModel()
- {
- Settings = new ObservableCollection<UserSettings>(AppSettings.Default.AllUserSettings);
- AnalyticsHandler = new AnalyticsViewModelHandler<ReportingWindowViewModel>(this);
- PropertyChanged += OnSelectedSetting;
- SelectedSetting = AppSettings.Default.CurrentUserSettings;
- }
- private void OnSelectedSetting(object sender, PropertyChangedEventArgs args)
- {
- if (args.PropertyName != "SelectedSetting")
- return;
- var appSettings = AppSettings.Default;
- var selectedSettingsIndex = Settings.IndexOf(SelectedSetting);
- appSettings.SetCurrentUserSettings(selectedSettingsIndex);
- UserStringSettingsHandler = new UserSettingsViewModelHandler<string>(appSettings.CurrentUserSettings);
- UserSlideSettingsHandler = new UserSettingsViewModelHandler<SlideSettings>(appSettings.CurrentUserSettings);
- }
- <TextBox Text="{Binding UserStringSettingsHandler[Name]}" />
Add Comment
Please, Sign In to add comment