2012-12-19 55 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」的集合。這不適合你嗎?

相關問題