繁体   English   中英

获取位于listView WPF中的文本框的内容

[英]Get content of textbox which is located in listView WPF

<ListView x:Name="listView2" HorizontalAlignment="Left" Height="215" Margin="348,10,0,0" VerticalAlignment="Top" Width="275">
    <ListView.View>
          <GridView>
               <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}"/>
               <GridViewColumn Header="Artikelnr" DisplayMemberBinding="{Binding Artikelnr}"/>
               <GridViewColumn Header="Bezeichnung" DisplayMemberBinding="{Binding Bezeichnung}"/>
               <GridViewColumn Header="Menge">
                   <GridViewColumn.CellTemplate>
                         <DataTemplate>
                              <TextBox x:Name="textBoxListView1" Width="80" Tag="{Binding Menge}"/>
                         </DataTemplate>
                   </GridViewColumn.CellTemplate>
               </GridViewColumn>    
           </GridView>
      </ListView.View>
 </ListView>

这是我的ListView,其中包含TextBoxes。 因此,文本框与行一样多。 我的问题是如何获取这些文本框的内容?

我已经尝试过了:

MyItem clMyItem = new MyItem();
clMyItem = (MyItem)listView2.Items.GetItemAt(zeile);

clArtikel.nId = Convert.ToInt32(clMyItem.Id);
clArtikel.cArtikelnr = clMyItem.Artikelnr;
clArtikel.cBezeichnung = clMyItem.Bezeichnung;
clArtikel.nMenge = clMyItem.Menge;

但对于clMyItem.Menge它仅返回一个空值,这可能是因为此代码仅在创建文本框后立即将其内容获取为状态。

尝试这个:

int index = listView2.SelectedIndex;
if (index != -1)
{
    MyItem items = (MyItem)listView2.Items.GetItemAt(index);
    if (items != null)
    {
         var textBoxContent = items.Menge;
     }
}

ListView的ItemsSource是一个ObservableCollection ,我在这里与Text属性绑定

<DataTemplate>
   <TextBox x:Name="textBox" Width="80" Text="{Binding Menge}"/>
/DataTemplate>

确保在MyItem类中实现了INotifyPropertyChanged ,以确保Menge属性得到更新:

public class MyItem : INotifyPropertyChanged
{
    private string _menge = "";
    public String Menge
    {
        get { return _menge; }
        set
        {
            _menge = value;
            RaisePropertyChanged();
        }
    }

    public string Artikelnr { get; set; } = "";
    public String Bezeichnung { get; set; } = "";
    public String Id { get; set; } = "";

    #region Inotify
    public event PropertyChangedEventHandler PropertyChanged;
    public void RaisePropertyChanged([CallerMemberName]string property = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property));
    }
    #endregion
}

输出:

图片

您也可以尝试完全不同的东西。

使用MVVM模式

首先创建一个Model来保存所有数据-称其为“ Bestellung”:

public class Bestellung
{
    public int ID {get; set;}
    public int ArtikelNummer {get; set;}
    public string Bezeichnung {get; set;}
    public int Menge {get; set;}
}

创建一个将数据绑定到视图的ViewModel

public class ViewModel : INotifyPropertyChanged
{
    public ObservableCollection<Bestellung> Bestellungen {get; set;} = new ObservableCollection<Bestellung>();

    //Implement INotifyPropertyChanged here
}

在XAML中,您需要将ItemsSource设置为ItemsSource="{Binding Bestellungen}" DataContext以便视图知道在哪里寻找Bindings

<ListView ItemsSouce="{Binding Bestellungen}">
<ListView.View>
      <GridView>
           <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}"/>
           <GridViewColumn Header="Artikelnr" DisplayMemberBinding="{Binding Artikelnr}"/>
           <GridViewColumn Header="Bezeichnung" DisplayMemberBinding="{Binding Bezeichnung}"/>
           <GridViewColumn Header="Menge">
               <GridViewColumn.CellTemplate>
                     <DataTemplate>
                          <TextBox Width="80" Text="{Binding Menge}"/>
                     </DataTemplate>
               </GridViewColumn.CellTemplate>
           </GridViewColumn>    
       </GridView>
  </ListView.View>

在这里,您将包含“ Menge”的TextBox绑定到ListView中每个项目的属性Menge

另外,您可以摆脱所有这些x:Name因为您将不再需要它们中的大多数。

您可以在YourWindow.xaml.cs执行此YourWindow.xaml.cs

//Code-Behind of your Window
public class YourWindow : Window
{
    public YourWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }
}

这样做的好处是您可以将逻辑和视图分开。


这意味着 :您将不再访问文本框-因为您不在乎它是TextBoxTextBlock还是sth。 其他。 您的逻辑不需要知道您的观点。

要访问和更改其中一项的任何属性,您可以执行以下操作:

//Add 3 pcs to the order
Bestellungen.First(bestellung => bestellung.Id == "010101").Menge += 3;

要么

//Delete an order
Bestellungen.Remove(Bestellungen[2]);

ObservableCollection观察您的模型,并在发生更改后将通知UI。 您的新价值应该立即可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM