2013-01-19 72 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" />