在XAML绑定中未调用ConvertBack

本文关键字:调用 ConvertBack XAML 绑定 | 更新日期: 2023-09-27 17:54:23

我使用一个DataGrid来显示一些商店库存信息。每件商品只能属于一种库存。

相关实体('StockEntity')具有如下属性:
"ItemId"、"ItemType","杂货店"、"阅读","浴室"。

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

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

DataGrid列是一个自定义列,包含(除其他外)一个TextBox。DataGrid被绑定到StockEntity对象的ObservableCollection上。我想将TextBox的值绑定到相关属性。例如,如果'ItemType' = 'Grocery',则文本框显示'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的值写回相同的实体对象,以保留实体的数据库连接属性,这一点至关重要!

许多谢谢。

在XAML绑定中未调用ConvertBack

我真正想要的是:

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

这不可能!

解决方案是将StockEntity对象包装在我自己的类中,并公开一个"绑定属性",该属性决定获取/设置哪个股票属性。现在我没有一个StockEntity对象集合,而是有一个WrapperClass对象的ObservableCollection来绑定DataGrid。包装器看起来像这样:

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