使用未命名的文本框和列表框进行数据绑定

时间:2016-07-12 00:06:17

标签: c# wpf xaml data-binding listbox

我最近在使用WPF和数据绑定时受过教育,最好不要命名任何字段,只是将它们与其他类中的属性相关联。我现在的问题是如何添加来自3个文本框的数据(用户输入),将绑定的信息保存到模型中,然后将帐户信息发布到侧面的列表框中。我需要将数据添加到我的模型中。我的main.xaml代码如下:

    <ListBox ItemsSource="{Binding Path=Files}" SelectedItem="{BindingPath=CurrentItem}" />

   <TextBox Text="{Binding Path=bankaccount}"/>
   <TextBox Text="{Binding Path=accountnumber}"/>
   <TextBox Text="{Binding Path=accounttype}"/>
   <Button Content="Save Data To Listbox" Click="Save_Click"/>

现在我将展示我的FileModel类,它保存了所有来自文本框的属性

        private short _BankAccount;
        private long _AccountNumber;
        private char _AccountType;

        public short bankaccount{ get { return _BankAccount;} set  {_BankAccount= value;    Notify("bankaccount"); } }
        public long accountnumber{ get { return _AccountNumber;} set {_AccountNumber= value; Notify("accountnumber"); } }
        public char accounttype{ get { return _AccountType;} set{_AccountType= value; Notify("accounttype"); } }

我使用一个名为ProgramModel的类作为Mainpage和FileModel页面之间的中间点,这里是代码:

 public class ProgramModel : INotifyPropertyChanged
{

    public ObservableCollection<FileModel> Files { get; set; }

    private FileModel _currentItem;
    public FileModel CurrentItem { get { return _currentItem; } set { _currentItem = value; Notify("CurrentItem"); } }


    public ProgramModel()
    {
        Files = new ObservableCollection<FileModel>();
    }

要完成它我有我的主页:

  internal partial class MainWindow
{

    public ProgramModel Model { get; set; }

    private ViewSettings _viewSettings = new ViewSettings();


    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = Model = new ProgramModel();

        }

    private void Save_Click(object sender, RoutedEventArgs e)
    {
        FileModel filemodel = new FileModel();

        Model.Files.Add(new FileModel( filemodel.bankaccount, filemodel.accountnumber, filemodel.accounttype));
    }

我觉得我从保存按钮事件中错误地添加到Files Collection。如果你们能帮助我,那就太好了!所有3个文本框和列表框都在主页面上。如果您有任何疑问,请告诉我。此外,这是一次学习体验,如果我发布的代码太多或者说不够,请告诉我。谢谢!

3 个答案:

答案 0 :(得分:3)

您从新的FileModel实例中读取值,而不是从绑定到视图的值读取。代码应该是这样的:

Model.Files.Add(new FileModel
(
    Model.CurrentItem.bankaccount,
    Model.CurrentItem.accountnumber,
    Model.CurrentItem.accounttype
));

确保CurrentItem实际上是使用实例初始化的,请不要在代码中看到它。此外,您可以在此处使用命令,并在绑定视图模型中具有所有相关逻辑,而无需事件。

此外,现在您将当前项目绑定到ListBox中的所选项目,这将修改现有实例。不确定这是否有意。如果您希望这些字段用于输入新实例,请不要将ListBox绑定到它。

答案 1 :(得分:0)

我不会直接回答您的问题,因为实施正确的数据绑定会需要一些代码来执行此操作。

使用正确的数据绑定,view.cs上几乎没有任何代码! (特别是如果你开始使用框架)

请查看A Simple MVVM Example,以便您遵循良好做法。

通过以下示例,您将看到您还可以在按钮和其他控件上使用数据绑定。

ProgramModel : INotifyPropertyChanged的视图模型应该处理所有工作(数据处理)。

您的模型不应该处理UI更新通知,

public short bankaccount{ get { return _BankAccount;} set  {_BankAccount= value;    Notify("bankaccount"); } }

将移至ProgramModel(查看模型)。

Save_Click方法也会转换为ICommand,并绑定到视图中的按钮,例如<Button Content="Save Data To Listbox" Command="{Binding SaveExec}"/>

关键是,如果你正在研究数据绑定,你应该正确实现它。希望你明白......

最后,您的Main.cs可能只有..

internal partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new ProgramModel();
    }
}

答案 2 :(得分:0)

只是一个小小的变化,它应该工作。更改您的绑定,如下所示为TextBoxes。

<TextBox Text="{Binding Path=CurrentItem.bankaccount}"/>

<TextBox Text="{Binding Path=CurrentItem.accountnumber}"/>

<TextBox Text="{Binding Path=CurrentItem.accounttype}"/>