【发布时间】: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