【问题标题】:Maintaining the collection in a List/ObservableCollection在 List/ObservableCollection 中维护集合
【发布时间】:2014-03-04 04:41:56
【问题描述】:

我已经成功地将项目添加到 MVVM 中的列表中,现在我的问题是在视图模型中维护列表。每次我导航到页面或返回页面并返回该列表视图时,列表都会重置。我将如何实现这一目标?我目前正在使用棱镜来构建 MVVM。

视图模型:

public ObservableCollection<CartData> _cartData;

public ObservableCollection<CartData> CartData
        {

         get {
             return _cartData;
             }
        set {

                SetProperty(ref _cartData, value);
           }
        }




        private DelegateCommand _addItemCommand;
        public ICommand AddItemCommand
        {
            get
            {
                if (_addItemCommand == null)
                {
                    _addItemCommand = new DelegateCommand(AddToCart);
                }
                return _addItemCommand;
            }
        }

        public void AddToCart() {

            CartData.Add(new CartData { Cakename = "Black Forest", Cakeprice = 104 });
                   }

查看:

 .....

 <Page.DataContext>
        <vm:CartingDataSource/>
    </Page.DataContext>
   ....
<ListView
            x:Name="itemListView"
            AutomationProperties.AutomationId="ItemsListView"
            AutomationProperties.Name="Items"
            TabIndex="1"
            Margin="-10,130,0,264"
            Padding="120,0,0,60"

            ItemsSource="{Binding cartData}"
            IsSwipeEnabled="False" Grid.RowSpan="2" ItemClick="itemListView_ItemClick" SelectionChanged="itemListView_SelectionChanged_1" IsItemClickEnabled="True">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="6">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Border Background="{ThemeResource ListViewItemPlaceholderBackgroundThemeBrush}" Width="60" Height="60">
                            <Image Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}" Source="Assets/wewewew.jpg"/>
                        </Border>
                        <StackPanel Grid.Column="1" Margin="10,0,0,0">
                            <TextBlock Text="{Binding Cakename}" Style="{StaticResource TitleTextBlockStyle}" TextWrapping="NoWrap" MaxHeight="40"/>
                            <TextBlock Text="{Binding Cakeprice}" Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap"/>
                        </StackPanel>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.ItemContainerStyle>
                <Style TargetType="FrameworkElement">
                    <Setter Property="Margin" Value="0,0,0,10"/>
                </Style>
            </ListView.ItemContainerStyle>
        </ListView>

【问题讨论】:

  • 我相信这个问题与您发布的另一个问题完全相同:Keep the collections in the list in MVVM。正如我对该讨论的评论,您似乎将视图注册为 Non-Singleton 实例。因此,容器不会保留 View 的引用并在您每次导航到它时创建一个新的。但是,如果您确实将视图注册为单例,那么如果您可以显示您是如何注册类型并导航到它们的,将会很有帮助。问候。

标签: c# xaml mvvm prism


【解决方案1】:

如果您的 ViewModel 是 CartingDataSource 在这种情况下,它会在每次页面加载时被实例化。现在,如果是这种情况,那么您将在构造函数中创建集合的新实例,如下所示:

public CartingDataSource() {


        CartData = new ObservableCollection<CartData>();

      }

因此它会重新初始化您的集合。

您需要从构造函数中删除初始化并执行以下操作:

public ObservableCollection<CartData> _cartData;

public ObservableCollection<CartData> cartData
    {

     get {
            if(_cartData == null)
            {
                 _cartData = new ObservableCollection<CartData>();
            } 
         return _cartData;
         }
    set {

            _cartData = value;
       }
    }

【讨论】:

  • 感谢您的回答,但这不起作用,我对 2 页​​使用相同的 mvvm。
  • CartingDataSource 是您的 ViewModel 吗?
  • 然后如果你调试你的代码,你会发现每次你的视图,绑定到你的 CartingDataSource 类被渲染,那时你的 ViewModel 构造函数将被调用。现在,因为您已经在构造函数中重新初始化了集合,所以每次加载 View 时它都会重新运行一个新集合。您肯定需要从构造函数中删除它。
  • 我需要删除什么?这个? CartData = new ObservableCollection&lt;CartData&gt;(); 但我已经删除了它并应用了你的答案但没有用:(
  • 我已经更新了答案。我相信您正在使用自定义SetProperty 方法来设置_cartData。你可以试试这个吗?如果您的集合正常工作并且集合已正确更新,那么您将不得不在整个代码中寻找您的集合的重新初始化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2011-04-11
相关资源
最近更新 更多