0

我已经实现了ListView绑定到 an 的a ,ObservableCollection当输入字段发生更改时,我需要更新每个项目。我正在使用完成的事件,但它只将条目值传递给完成的事件函数,我不知道我正在编辑什么对象。

有没有办法将对象参数传递给这些入口事件,以便我可以更新正确的对象?还是有更好的方法来做到这一点?

更新

这是我的列表视图代码

<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 中的 Observable Collection。

我需要做的是能够编辑每个单独的列表项及其各自的条目,并将其保存到其各自的对象中。我在 Entry 上尝试了完成的事件,但我无法将参数传递给它。我应该如何处理这个?

更新

模型

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

2 回答 2

0

如果我理解正确,您希望更改条目中的值并根据基础对象保存此更改。

检测条目更改的一种方法是,您需要检查 item-model 属性的更改(在 的帮助下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;

缺点是,您在条目中的每个字符更改时都保存您的对象(这不是很顺利)。

我的建议是,您可以添加一个带有命令的“保存”按钮(在此命令上,您可以发送额外的命令属性 -> 您的项目)

或者您实现一个单独的页面来修改每个项目(这是从用户界面到点的最清晰的方式)。但这取决于您的用例。

于 2016-08-10T15:35:38.313 回答
0

绑定列表视图的 selecteditem 属性并在您选择使用的任何条目事件完成时引用该属性。

<ListView
    x:Name="myListview"
    HorizontalOptions="Fill"
    VerticalOptions="FillAndExpand"
    ItemsSource="{Binding MyObservableCollection}"
    SelectedItem="{Binding MySelectedItem}"       
>
于 2016-08-10T15:59:11.997 回答