0

我正在使用 DataGrid 来显示一些商店库存信息。每个项目都可以属于一种类型的库存。

相关实体 ('StockEntity') 具有以下属性:
'ItemId'、'ItemType'、'Grocery'、'Reading'、'Bathroom'。

此表中的几个示例行是:
27, 'Grocery', 'Apple', null, null, null
127, 'Reading', null, 'Reading lamp', null, null

我无法控制数据库/实体结构。

DataGrid 列是一个自定义列,其中包含(除其他外)一个文本框。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 对象包装在我自己的类中,并公开一个“绑定属性”,它决定了要获取/设置的股票属性。我现在有一个 WrapperClass 对象的 ObservableCollection 来将 DataGrid 绑定到,而不是拥有 StockEntity 对象的集合。包装器看起来像:

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 回答