我最近在使用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个文本框和列表框都在主页面上。如果您有任何疑问,请告诉我。此外,这是一次学习体验,如果我发布的代码太多或者说不够,请告诉我。谢谢!
答案 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}"/>