DataGrid を使用して店舗の在庫情報を表示しています。各アイテムは、1 つのタイプの在庫に属することができます。
関連するエンティティ ('StockEntity') には、'ItemId'
、'ItemType'、'Grocery'、'Reading'、'Bathroom' などのプロパティがあります。
このテーブルの行の例は次のとおりです:
27, 'Grocery', 'Apple', null, null, null
127, 'Reading', null, 'Reading lamp', null, null
データベース/エンティティ構造を制御できません。
DataGrid 列は、(とりわけ) TextBox を含むカスタム列です。DataGrid は、StockEntity オブジェクトの ObservableCollection にバインドされています。TextBox の値を関連するプロパティにバインドしたいと考えています。たとえば、'ItemType' = 'Grocery' の場合、TextBox には 'Grocery' プロパティが表示されます。テキスト ボックスの値を変更すると、「Grocery」プロパティに書き戻されます。
これが私がこれまでに持っているものです:
XAML:
<TextBox Grid.Column="0" Padding="5" VerticalAlignment="Center" Width="155">
<TextBox.Text>
<Binding Path="."
Converter="{StaticResource StockDataToTextConverter}"
Mode="TwoWay"
UpdateSourceTrigger="LostFocus">
</Binding>
</TextBox.Text>
</TextBox>
コンバーターは単純です。
private StockEntity stock;
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
this.stock = value as StockEntity;
string text="";
if(this.stock!=null){
text = StockModel.GetStockData(this.stock);
}
return text;
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
string info = value as string;
if(info!=null && this.stock!=null){
StockModel.SetStockData(ref this.stock, info);
}
return stock;
}
StockModel.Get/SetStockData() メソッドは、単にリフレクションを使用して情報を取得し、正しいプロパティに戻します。Convert() メソッドは正常に機能します。TextBox は正しいデータを表示します。TextBox の値を編集すると、元の値に戻ります。ConvertBack() は呼び出されません。
Binding Path="." が原因で ConvertBack() メソッドが呼び出されていないと思いますが、これを回避する別の方法は考えられません。また、私が持っている方法で、バインドされたオブジェクトをコンバーターに「保存」できるかどうかもわかりません。エンティティのデータベース接続プロパティを保持するために、TextBox の値が同じエンティティ オブジェクトに書き戻されることが重要です。
どうもありがとう。