2017-11-29 57 views
0
<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です。したがって、行と同じ数のテキストボックスがあります。 私の質問は、どのようにこれらのテキストボックスの内容を取得できますか?listViewにあるテキストボックスの内容を取得します。WPF

は、私はすでに試したこの:

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のが唯一のこのコードは唯一のテキストボックスを作成した直後の状態でテキストボックスの内容を取得するためか、null値を返します。

+0

"おそらくこのコードは、テキストボックスが作成された直後の状態でテキストボックスの内容のみを取得するためです。"だから、正確にTextBox値を取得したいのですか?おそらくテキストが入力された後です。コードを呼び出してください。メモとして、すぐに別の値を代入すると 'clMyItem = new MyItem()'は冗長です。 – Clemens

答えて

0

これを試してみてください:

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

あなたが確認するためにMyItemクラスでINotifyPropertyChangedを実装してくださいプロパティ

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

リストビューのItemsSourceObservableCollectionであると私はTextとここにバインドさ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 
} 

出力:

Image

0

また全く違うのsomethinを試みることができます。

MVVM Patternを使用してください。

すべてのあなたのデータを保持するために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="{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にdirectrly "Menge" を含むあなたのTextBoxをバインドします。

x:Nameはもう大部分を必要としないため、これらのすべてを取り除くことができます。

あなたはこのことについて良いことは、あなたがあなたのロジックとビューを分離できるということであるYourWindow.xaml.cs

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

でこれを行うことができます。 - それはTextBoxTextBlockまたはSTHだ場合、あなたが気にしないので、あなたはもうあなたのテキストボックスにアクセスしません。意味


。 else。あなたのロジックは、あなたの見解を知る必要はありません。

は、アクセスしてあなただけのこの操作を行うことができ、あなたの項目のいずれかの任意のプロパティを変更するには:

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

または

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

ObservableCollection

は、あなたのモデルを観察し、何かが変わったら、UIを通知しますが。あなたの新しい価値はすぐに見えるはずです。

関連する問題