2017-07-10 14 views
0

私は、実際の読取りというリストからのデータでリストビューを持っています。各行には、ラベルとエントリがあり、どちらもリストのデータを表示します。エントリに表示されているデータを編集することができます。リストビューをループして、ユーザーが入力したデータを取得するにはどうすればよいですか?ListViewをループしてデータをエントリから取得する方法は? Xamarinフォーム

listviewに入力するコード。

list = new ListView 
{ 
     ItemsSource = actualmeterreading, 
     RowHeight = 50, 

     ItemTemplate = new DataTemplate(() => 
     { 
      printDesc = new Label(); 
      string desc = actualmeterreading[x].MachineMeterReadingList.Meterreadingdescription.Description; 
      printDesc.Text = desc; 
      meterreading = new Entry(); 
      string reading = actualmeterreading[x].ActualReading.ToString(); 
          meterreading.Text = reading; 
          meterreading.FontSize = 14; 

      x = x + 1; 

      //nameLabel2.WidthRequest = 300; 
      //nameLabel2.SetBinding(Entry.TextProperty, ""); 
      // Return an assembled ViewCell. 

      return new ViewCell 
      { 
        View = new StackLayout 
        { 
          Padding = new Thickness(0, 5), 
          Orientation = StackOrientation.Horizontal, 
          Children = 
          { 
           new StackLayout 
           { 
            VerticalOptions = LayoutOptions.Center, 
            Spacing = 0, 
            Children = 
            { 
             printDesc, 
             meterreading 
             //nameLabel2 

            } 
           } 
          } 
        } 
      }; 
     }) 
}; 

送信ボタンをクリックするとリストビューをループします。

private void submitbtn_Clicked(object sender, EventArgs e) 
    { 
     int x = 0; 
     foreach (var c in list.ItemsSource) 
     { 
      int r = c.? 
      myactualreading = new actualmeterreading 
      { 
       ActualReading = r 
      }; 
      x = x + 1; 
      dataservice.UpdateActualReading(myactualreading); 
     } 

    } 

私が検索したとき、Viewモデルと2つの方法バインディングに言及した人がいました。誰かがその1つまたは他のソリューションに関するいくつかの解決策を持っていますか?ありがとうございます

+1

最良の方法は、MVVMのデータバインディングを行うことです、あなたはその道を行くことを望んでいない場合は、単にテキストを書くエントリのイベントを変更し、更新ソースアイテムがアイデア – Krishna

答えて

0

あなたの要件を達成するために、以下のコードを参照してください。エントリーが編集されると、それはモデルに保存され、ラベルも反映されます。

  <ListView ItemsSource="{Binding Elements}"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <ViewCell> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition /> 
           <ColumnDefinition /> 
          </Grid.ColumnDefinitions> 
          <Entry Grid.Column="0" Text="{Binding Name,Mode=TwoWay}" /> 
          <Label Grid.Column="1" Text="{Binding Name,Mode=TwoWay}" /> 
         </Grid> 
        </ViewCell> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 


    public partial class MainPage : ContentPage 
    { 
     ObservableCollection<Model> elements; 
     public ObservableCollection<Model> Elements 
     { 
      get { return elements;} 
      set { elements = value;} 
     } 


     public MainPage() 
     { 
      Elements = new ObservableCollection<Model>() { new Model() { Name = "One" }, new Model() { Name = "Two" } }; 
      BindingContext = this; 
      InitializeComponent(); 
     } 
    } 

    public class Model : INotifyPropertyChanged 
    { 
     string name; 
     public string Name 
     { 
      get { return name; } 
      set { 
       name = value; 
       NotifyPropertyChanged("Name"); 
      } 
     } 

     private void NotifyPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 
+1

おかげで、私はしようとしたとき、私のループのmodel.Nameにアクセスすると、モデルに格納されている値ではなく古い値が返されます。私はitemsourceリスト内でループしています。 – batwing

+0

@batwingニュース?解決策を見つけましたか? – maliness