WPF双向数据绑定在更换绑定对象时不更新GUI

时间:2015-10-13 15:54:18

标签: c# wpf

我有一个应用程序在执行之前接受用户输入的配置设置。 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标记为以某种方式序列化?

0 个答案:

没有答案