我有一个应用程序在执行之前接受用户输入的配置设置。 UI字段使用双向数据绑定到对象。
当我在gui中进行更改时,数据绑定对象会更新。如果我在CS中更改对象属性,GUI将按原样更新。
现在,大多数设置可以模板化以用于不同的任务。所以我用JSON格式创建了几个模板。此JSON模板是执行前配置对象的脱水版本。
因此,如果一个人选择使用模板而不是输入所有设置,我会使用JSON,重新水化,然后用反序列化的json对象擦除现有对象。这是我认为它正在崩溃的地方,因为IPropertyNotify绑定不存在,或者没有正确连接到json生成的对象。此代码段显示了一般概念。完整代码将在下面。
var deserialized = JsonConvert.DeserializeObject<rtfMasterContext>(confFile);
rtf_Master.WorkItemConfig = deserialized.WorkItemConfig;
rtf_Master.WorkspaceItemConfig = deserialized.WorkspaceItemConfig;
rtf_Master.BranchMergeConfig = deserialized.BranchMergeConfig;
现在,如果我更改为更新属性的循环并且 NOT 打破INotify绑定,那么gui会使用模板化设置进行更新。
rtf_Master.WorkspaceItemConfig.SourceBranch = deserialized.WorkspaceItemConfig.SourceBranch;
正如这里所承诺的那样是完整的代码:
public partial class MainWindow : Window
{
rtfMasterContext rtf_Master = new rtfMasterContext();
public MainWindow()
{
InitializeComponent();
this.DataContext = rtf_Master;
}
}
XAML样本:
<Label>Source Branch</Label>
<TextBox Text="{Binding SourceBranch, Mode=TwoWay}" Margin="5,0,5,0"/>
上下文和子属性片段。
public class rtfMasterContext
{
....snip....
public WorkspaceItemConfig WorkspaceItemConfig { get; set; }
....etc....
}
[DataContract]
public class WorkspaceItemConfig : INotifyPropertyChanged
{
private string _sourceBranch;
[DataMember]
public string SourceBranch
{
get
{
return _sourceBranch;
}
set
{
_sourceBranch = value;
OnPropertyChanged();
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
所以我的问题是我应该怎么做。如果我坚持更新只是属性有一个更优雅的方式,然后为每个属性有一个像上面的行,当然会紧密耦合。如果没有更新,那么新配置值就会中断。
也许有一种方法可以替换第一个片段中的整个对象?如果是这样,那么我想我需要将IPropertyNotify标记为以某种方式序列化?