我正在使用DataGrid显示一些商店库存信息。每个项目都属于一种股票。
相关实体('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()。
我认为ConvertBack()方法没有被调用,因为Binding Path =“。”,但我想不出另一种解决方法。 我也不知道我是否可以按照我的方式“保存”转换器中的绑定对象。将TextBox的值写回同一实体对象至关重要,以保留实体的数据库连接属性!
非常感谢。
答案 0 :(得分:1)
我真正想要的是:
<Binding Path={Binding Path="ItemType"} />
这是不可能的!
解决方案是将StockEntity对象包装在我自己的类中,并公开一个'binding property',它决定了要获取/设置的stock属性。我现在有一个ObrapableCollection WrapperClass对象来绑定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" />