[英]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.