ビューモデルの監視可能なコレクションを ListView にバインドする際に問題が発生しています。ただし、コードが正しいことを示す興味深いものがあります(私が見る限り)
シナリオ: 「MainViewModel」を使用するメイン画面が 1 つあります。この mainviewmodel には、「OpenSaleItemViewModel」オブジェクトの監視可能なコレクションを持つ「OpenSaleViewModel」にバインドする ListView があります。
私が 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」に設定して、メイン画面で何が起こるかをテストすると、バインドするデータがないことを意味するため、メイン画面で監視可能なコレクションがnullの場合、ダイアログウィンドウにデータが正常に表示されます-したがって、異なるコレクションを持つ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");
}
}