[英]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();
}
}
這樣做的好處是您可以將邏輯和視圖分開。
這意味着 :您將不再訪問文本框-因為您不在乎它是TextBox
, TextBlock
還是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.