【问题标题】:WPF Binding to ListView using different instance of viewmodelWPF使用不同的viewmodel实例绑定到ListView
【发布时间】:2012-12-19 00:14:39
【问题描述】:

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

场景: 我有 1 个使用“MainViewModel”的主屏幕 这个 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");
        }
    }

【问题讨论】:

  • 您能提供您的视图模型的代码吗?通常,当绑定到视图模型列表时,我发现使用 ListBox 并依靠类型化的 DataTemplate 来自动表示每个列表项会更容易。
  • 更新:似乎是当我没有将任何内容绑定到主屏幕中的第一个 ListView 但首先在我的对话框窗口中绑定第二个时,它会显示信息 - 但如果我将信息绑定到第一个Listview 然后尝试绑定到我的第二个,信息不显示。即:如果我重新启动我的应用程序并确保第一个列表视图没有信息,而第二个列表视图有一组项目来绑定它的罚款..但反之亦然,当我遇到问题时..它似乎只喜欢 1一次使用列表框或其他东西...
  • 我已经放弃了!我决定使用我已经使用的控件之一,它是 devexpress 网格。自上一篇文章以来,我一直使用它,完全没有问题。我仍在主屏幕中使用现有的 GridView/Listview ...由于某种原因,两个控件之间存在冲突,同时绑定但没有能够浪费更多时间我将使用 devexpress 网格来解决问题。感谢大家抽出宝贵时间阅读和发表评论。

标签: wpf


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2021-09-23
    • 2018-02-20
    • 2023-03-19
    相关资源
    最近更新 更多