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

本文关键字:列表 数据绑定 未命名 文本 | 更新日期: 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}"/>