0

我已經實施了綁定到ObservableCollectionListView,並且我需要在輸入字段更改時更新每個項目。我正在使用已完成的事件,但它只會將輸入值傳遞給已完成的事件函數,並且我不知道我正在編輯哪個對象。如何將對象參數傳遞給Xamarin.Forms中的Entry事件?

是否有任何方法可以將對象參數傳遞給這些入口事件,以便我可以更新正確的對象?還是有更好的方法來做到這一點?

UPDATE

這是這是綁定到一個可觀察的集合,是在我的ViewModel我的列表視圖代碼

<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 --> 

我需要做的是能夠編輯每個單獨的列表項目與其各自的條目,並將其保存到其各自的對象。我嘗試了Entry上的完成事件,但是我無法傳遞參數。我應該如何處理這個問題?

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)); 
    } 
} 
} 

視圖模型

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請參閱上面的更新。謝謝 –

回答

0

如果我理解正確的,你想在一個條目來更改值並保存這個根據底層對象上的變化。

檢測條目變化的一種方法是,您需要檢查項目模型屬性的變化(藉助INotifyPropertyChanged)。直接在Set-部分或者您註冊OnPropertyChanged - 您的物品模型的事件。

這裏是你的財產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變化(這不是真正流暢)。

我的建議是,你要麼添加一個「保存」按鈕的命令(在這個命令你可以發送一個額外的命令屬性 - >您的項目)

或者你實現一個單獨的頁面修改每項目(這是從用戶界面指向的最清晰的方式)。但這取決於你的用例。

+0

我綁定listView的方式是一個Observable集合。這種方法會不會一樣? RaisePropertyChange聲明是否出現在我的可觀察集合對象類型的模型中? –

+0

這是來源。但是我正在討論'AC_SCSDraw'背後的特性 - Item – Joehl

+0

好的,所以我已經在模型上實現了您的建議,但我仍然沒有讓onProperty更改正常工作。我已經在問題中添加了我的ViewModel代碼和模型代碼,以便您可以看到我做了什麼。 –

0

綁定列表視圖的selecteditem屬性,並引用您選擇使用的任何入口事件完成。

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