C# WPF双向数据绑定在绑定对象被替换时不更新GUI
我有一个应用程序,它在执行之前接受用户对配置设置的输入。UI字段使用双向数据绑定到对象 当我在gui中进行更改时,数据绑定对象将按其应该的方式更新。如果我在CS中更改对象属性,GUI将按其应该的方式更新 现在,可以为不同的任务模板化大多数设置。所以我创建了几个JSON格式的模板。此JSON模板是执行前配置对象的脱水版本 因此,如果一个人选择使用一个模板而不是输入所有设置,我会对JSON进行重新水化,然后用反序列化的JSON对象清除现有对象。我认为这就是问题所在,因为IPropertyNotify绑定不存在,或者没有正确连接到json生成的对象。此代码片段显示了总体思路。完整的代码将在下面C# WPF双向数据绑定在绑定对象被替换时不更新GUI,c#,wpf,C#,Wpf,我有一个应用程序,它在执行之前接受用户对配置设置的输入。UI字段使用双向数据绑定到对象 当我在gui中进行更改时,数据绑定对象将按其应该的方式更新。如果我在CS中更改对象属性,GUI将按其应该的方式更新 现在,可以为不同的任务模板化大多数设置。所以我创建了几个JSON格式的模板。此JSON模板是执行前配置对象的脱水版本 因此,如果一个人选择使用一个模板而不是输入所有设置,我会对JSON进行重新水化,然后用反序列化的JSON对象清除现有对象。我认为这就是问题所在,因为IPropertyNotify
var deserialized = JsonConvert.DeserializeObject<rtfMasterContext>(confFile);
rtf_Master.WorkItemConfig = deserialized.WorkItemConfig;
rtf_Master.WorkspaceItemConfig = deserialized.WorkspaceItemConfig;
rtf_Master.BranchMergeConfig = deserialized.BranchMergeConfig;
正如承诺的那样,这里是完整的代码:
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"/>
所以我的问题是我应该如何继续。如果我坚持只更新属性,那么有没有一种更优雅的方法,可以像上面那样为每个属性使用一行代码,这当然是紧密耦合的。如果不更新新的配置值,则该值将中断
也许有一种方法可以替换第一个片段中的整个对象?如果是这样的话,我会想象我需要以某种方式将IPropertyNotify标记为序列化?您能在发布的代码中剪得更少吗?据我所见,TextBox应该绑定到“rtfMasterContext”类的属性“SourceBranch”,而这个属性并不存在;它出现在“WorkspaceItemConfig”上(这可能是您的问题…)。问题是
rtfMasterContext
的属性不会通知属性更改。在rtfMasterContext
@Mathew上实现INPC…对…因此,当交换对象时,rtfMasterContext将其视为属性更改!!让你的评论成为一个答案,这样我就可以接受并投票了。你能在张贴的代码中剪得少一点吗?据我所见,TextBox应该绑定到“rtfMasterContext”类的属性“SourceBranch”,而这个属性并不存在;它出现在“WorkspaceItemConfig”上(这可能是您的问题…)。问题是rtfMasterContext
的属性不会通知属性更改。在rtfMasterContext
@Mathew上实现INPC…对…因此,当交换对象时,rtfMasterContext将其视为属性更改!!回答你的评论,这样我就可以接受并投票。
<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));
}
}