簡體   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