我也是Xamarin Forms和MVVM模型的新手。我的应用程序中有一个列表视图。列表视图的项目来源是通过web api。我从api获取数据并在listview中显示。
我从api获取数据并使用JSON Net解析我的数据,设置为ListView的数据源。
string uriString = "http:*****************";
var response = await httpRequest(uriString) ;
System.Diagnostics.Debug.WriteLine(response);
SecondPage.bomItems = JsonConvert.DeserializeObject<List<BomListModel>>(response);
我的BomListModel
是
public class BomListModel : INotifyPropertyChanged
{
public int _PartNo { get; set; }
public bool _isChecked { get; set; }
public int _partQty { get; set; }
public int _qty { get; set; }
public string _partDesignation { get; set; }
public int PartNo
{
get { return _PartNo; }
set
{
_PartNo = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("PartNo"));
}
}
public bool isChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("isChecked"));
}
}
public int qty
{
get { return _qty; }
set
{
_qty = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("qty"));
}
}
public int partQty
{
get { return _partQty; }
set
{
_partQty = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("partQty"));
}
}
public string partDesignation
{
get { return _partDesignation; }
set
{
_partDesignation = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("partDesignation"));
}
}
private void NotifyPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
{
PropertyChanged(this, e);
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
一切都很好。数据正在显示。
我需要在2页中显示相同的数据。
首先在BomList
中作为
此处用户只能看到数据。
我将数据绑定为
<Label Text="{Binding PartNo}" TextColor="WhiteSmoke" FontSize="Small" HorizontalTextAlignment="Center" Grid.Column="0" Grid.Row="0" Margin="2" VerticalTextAlignment="Center"/>
<Label Text="{Binding partDesignation}" TextColor="WhiteSmoke" HorizontalTextAlignment="Start" FontSize="Small" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0" Margin="2" VerticalTextAlignment="Center"/>
<Label Text="{Binding partQty}" TextColor="WhiteSmoke" HorizontalTextAlignment="Center" FontSize="Small" Grid.Column="3" Grid.Row="0" Margin="2" VerticalTextAlignment="Center"/>
RequestQuote
中的第二页我将数据显示为
如果用户选择项目,他可以修改订单数量。
数据被绑定为
<Label Text="{Binding PartNo}" TextColor="DodgerBlue" FontSize="Small"
HorizontalTextAlignment="Center" Grid.Column="0" Grid.Row="0" Margin="2" VerticalTextAlignment="Center"></Label>
<Label Text="{Binding partDesignation}" TextColor="DodgerBlue" HorizontalTextAlignment="Start"
FontSize="Small" Grid.Column="1" Grid.ColumnSpan="3" Grid.Row="0" Margin="2" VerticalTextAlignment="Center"></Label>
<common:CustomCheckBox Grid.Column="4" Grid.Row="0" HeightRequest="20" WidthRequest="20"
VerticalOptions="Center" HorizontalOptions="Center" Checked="{Binding isChecked ,Mode=TwoWay}"
CheckedImage="checkbox_checked" UnCheckedImage="checkbox_unchecked"
CommandParameter="{Binding .}"/>
<Entry TextColor="Black" Grid.Column="5" Grid.Row="0" Text="{Binding partQty, Mode=TwoWay}"
FontSize="Small" VerticalOptions="End" HorizontalOptions="Center" IsEnabled="{Binding isChecked ,Mode=TwoWay}" />
这里出现问题。由于partQty
以TwoWay
模式绑定,如果用户在此修改数据,我的模型会更新,因此BomList
也会更新。
我使用static
列表视图通过app分享我的列表。我已在Second Page
中将其定义为
public static List<BomListModel> bomItems { get; set; }
有没有办法阻止数据更新?我需要TwoWay
模式绑定,因为我需要获得用户想要订购的产品数量。
我在模型中添加了一个var qty
。如何将我从api获取的partQty
复制到qty
。如果用户修改qty
partQty
应保持不受影响。
在写这个问题的过程中,我想到了一种方法。我可以制作listview bomItems
的副本并在RequestQuote
中使用,以便原始版本保持不变。这会是好方法吗?如果有任何其他方法可以实现相同目的,请告诉我。
提前致谢。 (抱歉发布很长的问题)
答案 0 :(得分:1)
如果我理解你要完成的任务,你可以试试这个的变体:
我在我的模型中添加了一个var数量。如何复制partQty 我从api到qty。如果用户修改了qty partQty 应保持不受影响。
您可以通过对BomListModel进行更改,在第一次要求时从partQty复制到qty:
<dependencies>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>3.2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-graphdb-api</artifactId>
<version>3.2.0-alpha02</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-kernel</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.neo4j.app</groupId>
<artifactId>neo4j-server</artifactId>
<version>3.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
只要qty不是反序列化的Json的一部分,_qty将保持为null,直到需要qty的值为止,此时它将用_partQty初始化。之后,qty和partQty的值是分开的 - 改变为1将不会影响另一个。
你的另一个想法:
我可以复制listview bomItems并在RequestQuote中使用,以便原始版本保持不变。这会是好方法吗?
也可能是一个好主意,它实际上取决于你想要完成的事情。例如,如果BomListModel意图从服务器获取一次,然后RequestQuote将多次使用不同的引号,后一种方法似乎要好得多。它清楚地将只读数据与可写数据分开,因此您不必担心来自一个RequestQuote的数据&#34;溢出&#34;因为qty是在静态列表中设置的,而不是在其间重置。
顺便说一句,它通常被认为是实际存储字段(如_qty,_partQty)的私有,而非公开的良好做法。