0

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 の値が同じエンティティ オブジェクトに書き戻されることが重要です。

どうもありがとう。

4

1 に答える 1

1

私が本当に欲しかったのは次のようなものでした:

<Binding Path={Binding Path="ItemType"} />

不可能だよ!

解決策は、StockEntity オブジェクトを独自のクラスでラップし、取得/設定するストック プロパティを決定する「バインディング プロパティ」を公開することでした。StockEntity オブジェクトのコレクションの代わりに、DataGrid をバインドする WrapperClass オブジェクトの ObservableCollection を用意しました。ラッパーは次のようになります。

public class WrapperClass{

    public WrapperClass(StockEntity se)
    {
        this._stock = se;
    }

    private StockEntity _stock;
    public stock {
        get { return _stock; }
        set { _stock = value; }
    }

    public string BindingProperty {
        get
        {
            // use reflection to return value
            return StockModel.GetStockData(this._stock);
        }

        set
        {
            // use reflection to set value
            StockModel.SetStockData(ref this._stock);
        }
    }
}

XAML は単純に次のようになりました。

<Binding Path="StockWrapper.BindingProperty" />
于 2013-01-22T20:53:41.330 に答える