2013-01-19 89 views
0

我正在使用DataGrid显示一些商店库存信息。每个项目可以属于一种类型的股票。ConvertBack未调用XAML绑定

相关实体('StockEntity')的属性如下:
'ItemId','ItemType','Grocery','Reading','Bathroom'。

此表中的几个例子行的是:
27, '杂货店', '苹果',NULL,NULL,NULL
127, '阅读',NULL, '台灯',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()方法没有被调用,因为绑定路径=“。”,但我想不出另一种方式。 我也不知道是否可以按照我的方式'保存'转换器中的绑定对象。将TextBox的值写回到同一个实体对象以保存实体的数据库连接属性至关重要!

非常感谢。

+0

你是正确的假设,那是因为你'Binding'的'Path'的。为什么不只是绑定到适当的属性? –

+0

有没有像'动态绑定'这样的东西?是否可以使用'ItemType'来选择要绑定的属性? – user1070084

回答

0

我真正想要的是一样的东西:

<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" />