Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF双向数据绑定在绑定对象被替换时不更新GUI_C#_Wpf - Fatal编程技术网

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

C# WPF双向数据绑定在绑定对象被替换时不更新GUI,c#,wpf,C#,Wpf,我有一个应用程序,它在执行之前接受用户对配置设置的输入。UI字段使用双向数据绑定到对象 当我在gui中进行更改时,数据绑定对象将按其应该的方式更新。如果我在CS中更改对象属性,GUI将按其应该的方式更新 现在,可以为不同的任务模板化大多数设置。所以我创建了几个JSON格式的模板。此JSON模板是执行前配置对象的脱水版本 因此,如果一个人选择使用一个模板而不是输入所有设置,我会对JSON进行重新水化,然后用反序列化的JSON对象清除现有对象。我认为这就是问题所在,因为IPropertyNotify

我有一个应用程序,它在执行之前接受用户对配置设置的输入。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;
正如承诺的那样,这里是完整的代码:

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));
    }


}