Конечно, вы можете.Прежде всего, ваш объект настроек должен реализовывать интерфейс INotifyPropertyChanged
.Это в основном добавляет событие, которое вызывается каждый раз, когда вы вызываете установщик свойства.Таким образом, привязка к свойствам вне зависимости работает в обоих направлениях.Вам не нужен этот интерфейс.Но если вы хотите, чтобы ваши изменения после первого набора (где все свойства читались) были отражены в пользовательском интерфейсе, вам нужен этот интерфейс.
Я обычно использую базовый класс для этого
public class PropertyChangedNotifier : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged
{
add { mPropertyChanged += value; }
remove { mPropertyChanged -= value; }
}
protected virtual void RaisePropertyChanged(string aPropertyName)
{
PropertyChangedEventHandler handler = mPropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(aPropertyName);
handler(this, e);
}
}
private PropertyChangedEventHandler mPropertyChanged;
}
Ваши настройки теперь должны быть получены из этого класса.
class MySettings : PropertyChangedNotifier
{
public string UserName
{
get{return mUserName;}
set{mUserName=value; RaisePropertyChanged("UserName");}
}
}
Теперь для пользовательского интерфейса DataBinding всегда связан с набором DataContext
.
<Window
x:Class="MyApp.MainWindow">
<StackPanel>
<TextBox Text="{Binding UserName}"/>
</StackPanel>
</Window>
Текстовое поле будет пытатьсячтобы получить его значение из текущего заданного контекста данных из свойства «Имя пользователя».Теперь, чтобы установить DataContext, мы можем сделать это в коде основного окна.
public MainWindow()
{
InitializeComponent();
DataContext = ReadMyUserSettings();
}
Если вы в любой момент измените свой Datacontext, пользовательский интерфейс обновится автоматически.И ваши изменения в текстовом поле будут записаны обратно в ваши настройки.Это также можно улучшить, добавив некоторый вид отмены и сохранения рабочего процесса, чтобы ваши настройки не изменились, если пользователь нажал кнопку «Отмена».См. IEditableObject
и BindingGroup
.
Надеюсь, это даст вам приблизительное представление о том, как это работает.