MSSQL サーバーにアクセスしている MVVM パターンと MVVM Light Toolkit を使用する WPF アプリケーションがあります。以下はサンプルデータベースです(私が持っているデータベースはより複雑です):
Employee Table:
|Name | ShipToLocation
---------------|--------------------
|John | 1
ShipToLocation Table:
|Code | CityName
------|------------------
| 1 | New York
EntityFramwork を使用して、データベース テーブルからオブジェクトを作成しました。私が抱えている問題は現在私のプログラムにあります。次のような多くの IValueConverters を使用する必要があります。
<ListBox Grid.Row="1" Grid.ColumnSpan="3" ItemsSource="{Binding Employees}" HorizontalContentAlignment="Stretch" SelectedItem="{Binding ThisEmployee}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IntToShipTo}">
<Binding Path="VendorCode" Mode="OneWay"/>
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}" Path="DataContext.ShipToLocations"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
私のViewModelには、Emplyoyeeのリストを保持するEmployeesというプロパティと、すべてのShip To Locationsのリストを持つShipToLocationsというプロパティがあります。ListBox の ItemSource が「Employees」に設定されているため、ShipToLocations プロパティにアクセスするには RelativeSource を使用する必要があり、これが設計時のビューの問題を引き起こしています。
この種のリンクは多くの場所で行われており、それぞれにコンバーターを作成する必要があります。これはオーバーヘッドが大きく、単体テストの悪夢のようです。
私が疑問に思っていたのは、従業員テーブルに ShipToFriendlyName という列を追加し、int が変更されたときにフレンド名を更新するトリガーを ShipToLocation フィールドにアタッチするのは悪い習慣ではないかということでした。これにより、整数のフレンドリ名を調べる必要があるたびにデータベース呼び出しを行う必要がなくなります。ありがとうございました