你当然可以。首先,您的设置对象应该实现INotifyPropertyChanged
界面。这基本上添加了一个事件,每次调用属性设置器时都会调用该事件。这样绑定到非依赖属性是双向的。您实际上并不需要该界面。但是,如果您希望第一组(读取所有属性)之后的更改反映在 ui 中,则需要该接口。
我通常使用一个基类
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");}
}
}
现在对于ui来说,DataBinding总是与集合相关DataContext
.
<Window
x:Class="MyApp.MainWindow">
<StackPanel>
<TextBox Text="{Binding UserName}"/>
</StackPanel>
</Window>
文本框将尝试从属性“UserName”的当前设置数据上下文中获取其值。现在要设置 DataContext,我们可以在后面的主窗口代码中执行此操作。
public MainWindow()
{
InitializeComponent();
DataContext = ReadMyUserSettings();
}
如果您随时更改数据上下文,用户界面会自动更新。
您对文本框的更改将写回您的设置。这也可以通过添加某种取消和保存工作流程来改进,这样如果用户点击取消,您的设置就不会更改。看IEditableObject
and BindingGroup
为了那个原因。
希望这能让您大致了解它是如何工作的。