2012-12-19 59 views
2

我有一个问题将视图模型的可观察集合绑定到ListView。 有件事然而有趣的,让我成功绑定这说明代码是正确的(据我可以看到)WPF使用视图模型的不同实例绑定到ListView

场景: 我有一个使用“MainViewModel” 这mainviewmodel 1个主屏幕上有一个ListView这绑定到一个'OpenSaleViewModel',而'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

我尝试的集合并将该集合绑定到我在应用程序中的其他位置打开的对话窗口,它仅向我显示命名空间和视图模型的名称:请参阅屏幕截图

enter image description here

我一直在使用路径= PROPERTYNAME和Data.PROPERTYNAME

,因为我在父视图模型访问属性,并成功地结合,你可以在3个标签网格上面看到的DataContext设置尝试。我已经调试过,并且可以看到每次销售都会收到正确数量的物品,但数据不会被重新模拟。如果我设置'ItemsSource =“{绑定OpenSale.OpenSalesItems'为'ItemsSource =”{绑定OpenSale'只是为了测试在主屏幕中发生了什么,这意味着没有数据要绑定,所以当主屏幕中的observable集合为空时,我的对话窗口确实显示了数据 - 所以我不明白为什么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> 

这是结合第一次在主屏幕

 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"); 
     } 
    } 
+1

你能提供你的viewmodels的代码?通常,当绑定到视图模型列表时,我发现使用ListBox更容易,并且依靠类型化的DataTemplate自动表示每个列表项。 –

+0

更新:似乎是当我没有绑定任何东西到主屏幕上的第一个ListView,但绑定第一个在我的对话窗口第一,它显示的信息 - 但如果我绑定信息到第一个ListView然后尝试绑定到我的第二个,信息不显示。即:如果我重新启动我的应用程序,并确保第一个listview将有没有信息,第二个有一个项目的集合绑定对它的罚款..但反之亦然当我得到的问题..它似乎只喜欢1 listbox被一次性使用或者... – Kev

+0

我已经放弃了这个!我决定使用其中一个控件即时通讯已经使用哪个是devexpress网格。自从上一篇文章以来,我一直没有任何问题。我仍然在主屏幕上使用现有的GridView/Listview ...出于某种原因,同时绑定了2个控件之间存在冲突,但无法浪费更多时间我将使用devexpress网格解决了这个问题。感谢您的时间来阅读和发表评论。 – Kev

回答

0

我觉得你的ItemsSource应该在你的GridView的不是在你的ListView来设置父视图模型“OpenSaleViewModel”的集合。这不适合你吗?

相关问题