0

Я внедрил ListView, который привязан к ObservableCollection, и мне нужно обновить каждый элемент при изменении полей ввода. Я использую завершенное событие, но оно только передает значение записи в завершенную функцию события, и я не знаю, какой объект я редактирую.Как передать параметр объекта в событие Entry в Xamarin.Forms?

Есть ли способ передать параметр объекта этим событиям ввода, чтобы я мог обновить правильный объект? Или есть лучший подход к этому?

UPDATE

Это мой список кодов вид

<ListView 
      x:Name="DrawReturnList" 
      RowHeight="65" 
      BackgroundColor="#ffffff" 
      CachingStrategy="RecycleElement" 
      ItemsSource="{Binding SCSDraw}" 
      ItemSelected = "OnItemTapped" 
      IsPullToRefreshEnabled="false" 
      Margin="0, -10, 0, 0"> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <ViewCell> 
         <StackLayout VerticalOptions="FillAndExpand" 
            HorizontalOptions="FillAndExpand" 
            Orientation="Vertical" 
            Padding="10"> 

          <StackLayout Orientation="Horizontal"> 
           <StackLayout HorizontalOptions="FillAndExpand" WidthRequest="90" Padding="0, 10, 0, 0"> 
           <Label Text="{Binding PubDateShort3}" FontSize="18"/> 
           </StackLayout> 

           <StackLayout HorizontalOptions="FillAndExpand" Orientation="Horizontal"> 

            <Grid HorizontalOptions="FillAndExpand" ColumnSpacing="0" RowSpacing="0"> 
             <Grid.RowDefinitions> 
             <RowDefinition Height="*" /> 

             </Grid.RowDefinitions> 
             <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="*" /> 
             <ColumnDefinition Width="*" /> 
             <ColumnDefinition Width="*" /> 
             </Grid.ColumnDefinitions> 

             <StackLayout Grid.Row="0" Grid.Column="0" Padding="0, 10, 0, 0"> 
             <Label Text="{Binding InitialDraw}" FontSize="18"/> 
             </StackLayout> 
             <StackLayout Grid.Row="0" Grid.Column="1"> 
              <Entry IsEnabled="{Binding ACLockFL, Converter={StaticResource not}}" Keyboard="Numeric" Placeholder="Draw" Text="{Binding Draw, Mode=TwoWay}" VerticalOptions="Center"/> 
             </StackLayout> <!-- end Draw --> 
             <StackLayout Grid.Row="0" Grid.Column="2"> 
              <Entry IsEnabled="{Binding ACLockFL, Converter={StaticResource not}}" Keyboard="Numeric" Placeholder="Returns" Text="{Binding Returns, Mode=TwoWay}" VerticalOptions="Center"/> 
             </StackLayout> <!-- end Return --> 
            </Grid> 


           </StackLayout> 
          </StackLayout><!-- end input group --> 



         </StackLayout> <!-- end Draw & Return Section--> 
        </ViewCell> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> <!-- end list view --> 

Это переплетены к наблюдаемому коллекции, которая находится в моем ViewModel.

Что мне нужно сделать, так это возможность редактировать каждый отдельный элемент списка с соответствующей записью и сохранять его в соответствующем объекте. Я попробовал завершенное событие в Входе, но я не могу передать параметр этому. Как мне подойти к этому?

UPDATE

МОДЕЛЬ

using System; 
using System.ComponentModel; 
using Collector.Helpers; 

namespace Collector 
{ 
    public class AC_SCSDraw : EntityData, INotifyPropertyChanged 
    { 
    private int draw; 
    private int returns; 

    public decimal CarrierID { get; set; } 
    public decimal RspID { get; set; } 
    public string RspName { get; set; } 
    public decimal SCSDrawID { get; set; } 
    public decimal PubID { get; set; } 
    public string PubDesc { get; set; } 
    public string WeekDay { get; set; } 
    public DateTime PubDate { get; set; } 
    public string PubDateShort3 { get; set; } 
    public int Draw 
    { 
     get { return draw; } 
     set 
     { 
      draw = value; 
      OnPropertyChange("Draw"); 
     } 
    } 
    public int Returns 
    { 
     get { return returns; } 
     set 
     { 
      returns = value; 
      OnPropertyChange("Returns"); 
     } 
    } 
    public int InitialDraw { get; set; } 
    public bool ACLockFL { get; set; } 



    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChange(string name) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
} 
} 

ViewModel

ObservableCollection<AC_SCSDraw> scsDraw = new ObservableCollection<AC_SCSDraw>(); 
    public ObservableCollection<AC_SCSDraw> SCSDraw 
    { 
     get { return scsDraw; } 
     set 
     { 
      scsDraw = value; 
      OnPropertyChanged("SCSDraw"); 
     } 
    } 
public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     var changed = PropertyChanged; 
     if (changed != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
+0

Пожалуйста, добавьте фрагмент кода, чтобы мы увидели, что вы пытались хотя бы. В противном случае почти невозможно помочь – Joehl

+0

@Joehl, пожалуйста, см. Выше update.Thanks –

ответ

0

Если я вас правильно понял, вы хотите, чтобы изменить значение в записи и сохранить это изменяется в зависимости от базового объекта.

Один из способов обнаружения изменения в записи - проверить изменения в свойстве модели товара (с помощью INotifyPropertyChanged). Либо непосредственно в Set -part, либо вы зарегистрируете OnPropertyChanged -Event вашей модели товара.

Вот пример для недвижимости Draw (первая запись)

public string Draw 
{ 
    get { return _draw; } 
    set 
    { 
     if (value == _draw) return; 

     _draw= value; 
     RaisePropertyChanged("Draw"); 

     // Here you can save your object 
    } 
} 
private string _draw; 

Недостаток заключается в том, что вы сохраните объект на каждом charachter-изменения в записи (это не очень гладко).

Мое предложение, что вы либо добавить кнопку «сохранить» с помощью команды (по этой команде вы можете отправить дополнительную команду-свойство -> ваш пункт)

Или вы реализуете отдельную страницу, чтобы изменить каждый item (это самый ясный путь от точки пользовательского интерфейса). Но это зависит от вашего варианта использования.

+0

Способ, которым я привязываю listView к коллекции Observable. Будет ли такой подход одинаковым? Объявляется ли объявление RaisePropertyChange в модели моего наблюдаемого типа объекта коллекции? –

+0

Это для источника.Но я говорю о procprty за «AC_SCSDraw'-Item – Joehl

+0

ОК, поэтому я внедрил ваше предложение по модели, но я все еще не могу изменить работу onProperty. Я добавил код ViewModel и код модели в вопросе, чтобы вы могли видеть, что я сделал. –

0

Привязать свойство selecteditem listview и ссылаться на то, когда любое событие записи, которое вы решили использовать, завершается.

<ListView 
    x:Name="myListview" 
    HorizontalOptions="Fill" 
    VerticalOptions="FillAndExpand" 
    ItemsSource="{Binding MyObservableCollection}" 
    SelectedItem="{Binding MySelectedItem}"  
>