2

我在将可观察的视图模型集合绑定到 ListView 时遇到问题。但是有一些有趣的东西可以让我成功绑定,这表明代码是正确的(据我所知)

场景:我有 1 个使用“MainViewModel”的主屏幕这个主视图模型有一个 ListView,它绑定到一个“OpenSaleViewModel”,后者又具有一个可观察的“OpenSaleItemViewModel”对象集合。

我在 XAML 中的代码工作正常: DisplayMemberBinding 工作正常

<Grid x:Name="SalesScreenHolder" Background="AliceBlue" VerticalAlignment="Stretch" >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="70" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <Grid x:Name="grdSalesWindow" Margin="0,0,0,0" Grid.Row="0" Width="300" Height="350" MaxHeight="1000" DataContext="{Binding Main, Source={StaticResource MainVM}}">
                        <ScrollViewer x:Name="salesScrollViewer" PanningMode="VerticalOnly" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden" >
                            <ListView x:Name="lstviewSales" ItemContainerStyle="{StaticResource alternatingListViewItemStyle}" AlternationCount="2" HorizontalAlignment="Left" HorizontalContentAlignment="Left" ItemsSource="{Binding OpenSale.OpenSalesItems, UpdateSourceTrigger=PropertyChanged}">
                                <!--<ListView.ItemContainerStyle>
                                    <Style TargetType="ListViewItem">
                                        <Setter Property="Height" Value="30" />  
                                    </Style>
                                </ListView.ItemContainerStyle>-->
                                <ListView.View>
                                    <GridView x:Name="listViewGrid">
                                        <GridViewColumn Width="150" Header="Item"
                                            DisplayMemberBinding="{Binding SaleItemName}" />
                                        <GridViewColumn Width="50" Header="Qty"  
                                            DisplayMemberBinding="{Binding Quantity}" />
                                        <GridViewColumn Width="90" Header="TotalPrice" 
                                            DisplayMemberBinding="{Binding TotalAmtString}" />
                                    </GridView>
                                </ListView.View>

                            </ListView>
                        </ScrollViewer>

现在说我有 4 个 OpenSaleViewModel 对象,每个销售 1 个,每个都有自己的 SalesItems 集合

我尝试将集合绑定到我在应用程序其他位置打开的对话框窗口,它只显示名称空间和视图模型的名称:见截图

在此处输入图像描述

我尝试使用 path=PROPERTYNAME 和 Data.PROPERTYNAME

正如您在网格上方的 3 个标签中看到的那样,在我访问父视图模型中的属性并成功绑定时设置了数据上下文。我已经调试过,可以看到每次销售都提取了正确数量的物品,但数据没有被识别。

问题是如果我将 'ItemsSource="{Binding OpenSale.OpenSalesItems' 设置为 'ItemsSource="{Binding OpenSale' 只是为了测试主屏幕中发生的情况,这意味着没有要绑定的数据,所以看起来当主屏幕中的可观察集合为空时,我的对话框窗口确实显示数据正常 - 所以我无法理解为什么具有不同集合的 2 个不同视图模型(尽管使用相同的类作为集合的基础)似乎是冲突的?似乎我只能在只有 1 个窗口使用相同类型视图模型的集合时才能绑定(在本例中为销售视图模型中的“SaleItems”)

这是我的对话窗口的代码

        <Grid x:Name="grdTableSalesItemsxxc" Margin="2,0,2,0" Grid.Row="0" Width="610" Height="200" MaxHeight="1000" >
            <ScrollViewer x:Name="tableSalesScrollViewer" PanningMode="VerticalOnly" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden" >
                <ListView x:Name="lstviewTableSalexxc" ItemContainerStyle="{StaticResource alternatingListViewItemStyle}" AlternationCount="2" 
                                            HorizontalAlignment="Stretch" HorizontalContentAlignment="Left" ItemsSource="{Binding Sale.OpenSalesItems, BindsDirectlyToSource=True, UpdateSourceTrigger=PropertyChanged}" >
                    <!--<ListView.ItemContainerStyle>
                        <Style TargetType="ListViewItem">
                            <Setter Property="Height" Value="30" />
                        </Style>
                    </ListView.ItemContainerStyle>-->
                    <ListView.View>
                        <GridView x:Name="grdTableSaleGridxxc">
                            <GridViewColumn Width="295" Header="Item Name"
                                            DisplayMemberBinding="{Binding SaleItemName}" />
                            <!--<GridViewColumn Width="100" Header="Quantity"  
                                            DisplayMemberBinding="{Binding SaleItemName}" />
                            <GridViewColumn Width="105" Header="Total Price" 
                                            DisplayMemberBinding="{Binding SaleItemName}" />-->    
                        </GridView>
                    </ListView.View>
                </ListView>
            </ScrollViewer>

这是第一次在主屏幕中绑定的父视图模型“OpenSaleViewModel”的集合

     public ObservableCollection<OpenSaleItemViewModel> OpenSalesItems
        {

        get
        {
            if (_salesItems == null)
            {
                _salesItems = new ObservableCollection<OpenSaleItemViewModel>();

                foreach (OpenSaleItem itm in _openSale.OpenSaleItems)
                {
                    // Check if we need to grab the stockPLU or RecipeProduct PLU
                    if (itm.StockPLU != null)
                    {
                        _osi = new OpenSaleItemViewModel(itm.StockPLU);
                    }
                    else
                    {
                        _osi = new OpenSaleItemViewModel(itm.RecipeProductID);
                    }

                    // Populate remaining properties
                    _osi.Quantity = itm.Quantity;
                    _osi.TotalAmount = itm.TotalAmount;
                    _osi.SalesUnitCostPrice = itm.SalesUnitCostPrice;

                    if (itm.OpenSale != null)
                        _osi.OpenSaleID = itm.OpenSale.ID;

                    _salesItems.Add(_osi);
                }
            }

            return _salesItems;
        }
        set
        {
            _salesItems = value;
            RaisePropertyChanged("OpenSalesItems");
            RaisePropertyChanged("TotalVAT");
            RaisePropertyChanged("TotalAmtIncVAT");
        }
    }
4

1 回答 1

0

我觉得你的 ItemsSource 应该设置在你的 GridView 上而不是你的 ListView 上。那对你不起作用吗?

于 2013-01-05T00:46:56.907 回答