我在将可观察的视图模型集合绑定到 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");
}
}