使用未命名的文本框和列表框进行数据绑定
本文关键字:列表 数据绑定 未命名 文本 | 更新日期: 2023-09-27 17:56:31
最近被教导在使用 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的类作为主页和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));
}
我觉得我从保存按钮事件错误地添加到文件集合中。如果你们能帮助我,那就太好了!所有 3 个文本框和列表框都在主页上。 如果您有任何问题,请告诉我。 此外,这是一种学习体验,因此如果我发布的代码过多或不够,请告诉我。 谢谢!
从新的FileModel
实例读取值,而不是从绑定到视图的内容中读取值。代码应该是这样的:
Model.Files.Add(new FileModel
(
Model.CurrentItem.bankaccount,
Model.CurrentItem.accountnumber,
Model.CurrentItem.accounttype
));
确保CurrentItem
实际上是用实例初始化的,不要在代码中看到它。此外,您可以在此处使用命令,并在绑定视图模型中拥有所有相关逻辑,而无需该事件。
此外,现在您将当前项目绑定到ListBox
中的选定项目,这将修改现有实例。不确定这是否是有意的。如果您希望这些字段用于新实例的输入,请不要将ListBox
绑定到它。
我不打算直接回答你的问题,因为实现正确的数据绑定需要一些代码才能做到这一点。
使用适当的数据绑定,您的视图上几乎不会有代码.cs!(特别是如果你开始使用框架)
请查看一个简单的 MVVM 示例,以便您遵循良好做法。
通过遵循此示例,您将看到还可以对按钮和其他控件使用数据绑定。
您的视图模型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}"/>
关键是,如果你正在研究数据绑定,你应该正确地实现它。希望你明白...
最后,您的主.cs可能只是..
internal partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ProgramModel();
}
}
只是一个小小的变化,它应该可以工作.更改文本框的绑定,如下所示。
<TextBox Text="{Binding Path=CurrentItem.bankaccount}"/>
<TextBox Text="{Binding Path=CurrentItem.accountnumber}"/>
<TextBox Text="{Binding Path=CurrentItem.accounttype}"/>