如何将对象参数传递给 Xamarin.Forms 中的 Entry 事件?
How can I pass an object parameter to an Entry event in Xamarin.Forms?
我已经实现了一个绑定到 ObservableCollection
的 ListView
,我需要在输入字段更改时更新每个项目。我正在使用 completed 事件,但它只将入口值传递给 completed 事件函数,我不知道我正在编辑什么对象。
有什么方法可以将对象参数传递给这些入口事件,以便我可以更新正确的对象吗?还是有更好的方法来做到这一点?
更新
这是我的列表视图代码
<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 集合。
我需要做的是能够编辑每个单独的列表项及其各自的条目,并将其保存到各自的对象中。我在 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));
}
}
如果我没理解错的话,您想更改条目中的值并根据底层对象保存此更改。
检测条目变化的一种方法是,您需要检查项目模型 属性 中的变化(在 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;
缺点是,您会在条目中的每个字符更改时保存您的对象(这不是很顺利)。
我的建议是,您可以添加一个带有命令的 "save" 按钮(在此命令上您可以发送一个额外的命令-属性 -> 您的项目)
或者你实现一个单独的页面来修改每个项目(这是从用户界面到点的最清晰的方式)。但这取决于您的用例。
绑定列表视图的选定项属性并在您选择使用的任何输入事件完成时引用它。
<ListView
x:Name="myListview"
HorizontalOptions="Fill"
VerticalOptions="FillAndExpand"
ItemsSource="{Binding MyObservableCollection}"
SelectedItem="{Binding MySelectedItem}"
>
我已经实现了一个绑定到 ObservableCollection
的 ListView
,我需要在输入字段更改时更新每个项目。我正在使用 completed 事件,但它只将入口值传递给 completed 事件函数,我不知道我正在编辑什么对象。
有什么方法可以将对象参数传递给这些入口事件,以便我可以更新正确的对象吗?还是有更好的方法来做到这一点?
更新
这是我的列表视图代码
<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 集合。
我需要做的是能够编辑每个单独的列表项及其各自的条目,并将其保存到各自的对象中。我在 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));
}
}
如果我没理解错的话,您想更改条目中的值并根据底层对象保存此更改。
检测条目变化的一种方法是,您需要检查项目模型 属性 中的变化(在 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;
缺点是,您会在条目中的每个字符更改时保存您的对象(这不是很顺利)。
我的建议是,您可以添加一个带有命令的 "save" 按钮(在此命令上您可以发送一个额外的命令-属性 -> 您的项目)
或者你实现一个单独的页面来修改每个项目(这是从用户界面到点的最清晰的方式)。但这取决于您的用例。
绑定列表视图的选定项属性并在您选择使用的任何输入事件完成时引用它。
<ListView
x:Name="myListview"
HorizontalOptions="Fill"
VerticalOptions="FillAndExpand"
ItemsSource="{Binding MyObservableCollection}"
SelectedItem="{Binding MySelectedItem}"
>