使用MVVM模式创建向导-数据绑定和GUI更新不起作用

使用MVVM模式创建向导-数据绑定和GUI更新不起作用,mvvm,Mvvm,我正在创建用于自动生成报告的向导。因此,用户在主窗口中输入几个问题,完成后,他可以通过单击按钮创建一个自动填写的报告。他还需要在输入的问题之间切换(因此,我将问题放入“符合”类型的列表中) 主窗口包含不同的控件,用户可以在其中输入一些信息。 所有控件都以这种方式绑定到模型(例如文本框): “SingleCompliant”是ViewModel的对象,类型为“Compliant”(模型的一部分),包含一个问题所需的所有属性 当我第一次加载应用程序时,一切正常。 但是当我单击“SaveComplia

我正在创建用于自动生成报告的向导。因此,用户在主窗口中输入几个问题,完成后,他可以通过单击按钮创建一个自动填写的报告。他还需要在输入的问题之间切换(因此,我将问题放入“符合”类型的列表中)

主窗口包含不同的控件,用户可以在其中输入一些信息。 所有控件都以这种方式绑定到模型(例如文本框):

“SingleCompliant”是ViewModel的对象,类型为“Compliant”(模型的一部分),包含一个问题所需的所有属性

当我第一次加载应用程序时,一切正常。 但是当我单击“SaveCompliantNext”时,“SingleCompliant”对象之间的绑定丢失,GUI没有更新。在这个方法中(由命令引发),我创建了一个新的SingleCompliant对象。 我需要做什么才能获得一个带有空gui的新对象,以便用户可以继续输入下一个问题

这是实现了“PropertyChanged”处理的ViewModel:

public class Compliant_ViewModel : ObservableCollection<Compliant>  //INotifyPropertyChanged
{

    /// <summary>
    /// MainWindow Controls are binded to Attributes of this object 
    /// </summary>
    private Compliant _SingleCompliant;

    public ObservableCollection<Compliant> CompliantListReport
    {
        get { return _CompliantListReport; }
        private set { _CompliantListReport = value; }
    }


    /// <summary>
    /// Beandstandungs-Objekt
    /// </summary>
    public Compliant SingleCompliant
    {
        get { return _SingleCompliant; }
        set
        { _SingleCompliant = value;
            OnPropertyChanged("SingleCompliant");
        }
    }

    /// <summary>
    /// Load next Compliant to the GUI
    /// </summary>
    public NextCompliant_Command NextCompliant_command { get; private set; }
    /// <summary>
    /// Load previous Compliant to the GUI
    /// </summary>
    public PreviousCompliant_Command PreviousCompliant_Command { get; private set; }

    /// <summary>
    /// Constructor
    /// </summary>
    public Compliant_ViewModel()
    {
        SingleCompliant = new Compliant();
        CompliantListReport = new ObservableCollection<Compliant>();

        NextCompliant_command = new NextCompliant_Command(SaveCompliantAndNext);
        PreviousCompliant_Command = new PreviousCompliant_Command(LoadPreviousCompliant);
        CreateReport_Command = new CreateReport_Command(CreateReport);

    }

    public void SaveCompliantAndNext()
    {
        CompliantListReport.Add(SingleCompliant);
        // >>>>>   Not working - databinding get lost and gui not updating
        SingleCompliant = new Compliant();
    }

    public void LoadPreviousCompliant()
    {
        if (this.SingleCompliant.CompliantID > 0)
        { this.SingleCompliant = this.CompliantListReport[this.SingleCompliant.CompliantID - 1]; }
        else
        { this.SingleCompliant = this.CompliantListReport[0]; }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyname)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        { handler(this, new PropertyChangedEventArgs(propertyname));  }
    }
}
XAML: 一个文本框的示例:

在合规性(问题)之间切换的XAML按钮:


我做错了什么

public class Compliant_ViewModel : ObservableCollection<Compliant>  //INotifyPropertyChanged
{

    /// <summary>
    /// MainWindow Controls are binded to Attributes of this object 
    /// </summary>
    private Compliant _SingleCompliant;

    public ObservableCollection<Compliant> CompliantListReport
    {
        get { return _CompliantListReport; }
        private set { _CompliantListReport = value; }
    }


    /// <summary>
    /// Beandstandungs-Objekt
    /// </summary>
    public Compliant SingleCompliant
    {
        get { return _SingleCompliant; }
        set
        { _SingleCompliant = value;
            OnPropertyChanged("SingleCompliant");
        }
    }

    /// <summary>
    /// Load next Compliant to the GUI
    /// </summary>
    public NextCompliant_Command NextCompliant_command { get; private set; }
    /// <summary>
    /// Load previous Compliant to the GUI
    /// </summary>
    public PreviousCompliant_Command PreviousCompliant_Command { get; private set; }

    /// <summary>
    /// Constructor
    /// </summary>
    public Compliant_ViewModel()
    {
        SingleCompliant = new Compliant();
        CompliantListReport = new ObservableCollection<Compliant>();

        NextCompliant_command = new NextCompliant_Command(SaveCompliantAndNext);
        PreviousCompliant_Command = new PreviousCompliant_Command(LoadPreviousCompliant);
        CreateReport_Command = new CreateReport_Command(CreateReport);

    }

    public void SaveCompliantAndNext()
    {
        CompliantListReport.Add(SingleCompliant);
        // >>>>>   Not working - databinding get lost and gui not updating
        SingleCompliant = new Compliant();
    }

    public void LoadPreviousCompliant()
    {
        if (this.SingleCompliant.CompliantID > 0)
        { this.SingleCompliant = this.CompliantListReport[this.SingleCompliant.CompliantID - 1]; }
        else
        { this.SingleCompliant = this.CompliantListReport[0]; }
    }


    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyname)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        { handler(this, new PropertyChangedEventArgs(propertyname));  }
    }
}
 public class Compliant : INotifyPropertyChanged
{

    public string _Text;
    public string Text
    {
        get { return _Text; }
        private set
        {
            _Text = value;
            OnPropertyChanged("Text");
        }
    }

    #region Konstruktoren
    public Compliant()
    { }

    #region Interface

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyname)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyname));
        }
    }

    #endregion Interface
}
<!--Previous Compliant (Issue)-->
<Button x:Name="BtnBack_Compliant" Content="{DynamicResource Back}" Command="{Binding PreviousCompliant_Command}"/>
<!--Next Compliant (Issue)-->
<Button x:Name="BtnForeward_Compliant" Content="{DynamicResource Foreward}" Command="{Binding NextCompliant_command}" />