使用MVVM模式创建向导 - 数据绑定和GUI更新无法正常工作

时间:2017-06-21 06:24:17

标签: mvvm

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

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

Text="{Binding Path=SingleCompliant.Text, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"

“SingleCompliant”是“合规”类型(模型的一部分)的ViewModel的对象,其中包含一个问题所需的所有属性。

当我第一次加载应用程序时,一切正常。 但是当我点击“SaveCompliantAndNext”时,“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));  }
    }
}

这是模特:

 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
}

XAML: 一个文本框的示例: <TextBox Text="{Binding Path=SingleCompliant.Text, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" x:Name="Text" />

XAML按钮在Compliants(问题)之间切换:

<!--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}" />

我做错了什么?

0 个答案:

没有答案