如何在Xamarin Forms中将一个var复制到模型中的其他var

时间:2017-09-23 05:27:25

标签: listview xamarin mvvm xamarin.forms

我也是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中作为

enter image description here

此处用户只能看到数据。

我将数据绑定为

<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中的第二页我将数据显示为

enter image description here

如果用户选择项目,他可以修改订单数量。

数据被绑定为

<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}" />

这里出现问题。由于partQtyTwoWay模式绑定,如果用户在此修改数据,我的模型会更新,因此BomList也会更新。 我使用static列表视图通过app分享我的列表。我已在Second Page中将其定义为

public static List<BomListModel> bomItems { get; set; }

有没有办法阻止数据更新?我需要TwoWay模式绑定,因为我需要获得用户想要订购的产品数量。 我在模型中添加了一个var qty。如何将我从api获取的partQty复制到qty。如果用户修改qty partQty应保持不受影响。

在写这个问题的过程中,我想到了一种方法。我可以制作listview bomItems的副本并在RequestQuote中使用,以便原始版本保持不变。这会是好方法吗?如果有任何其他方法可以实现相同目的,请告诉我。

提前致谢。 (抱歉发布很长的问题)

1 个答案:

答案 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)的私有,而非公开的良好做法。