1

如何获取绑定属性的底层数据类型?

出于测试目的,我创建了一个具有 Int32 类型属性“Age”的视图模型“Person”,该属性绑定到文本框的文本属性。

有没有类似...

BindingOperations.GetBindingExpression(this, TextBox.TextProperty).PropertyType

还是只能通过反射来检索这些信息?

myBinding.Source.GetType().GetProperty("Age").PropertyType

编辑:我有一个自定义文本框类,我想在其中附加我自己的验证规则、转换器......

在文本框类的“加载”事件中获取信息会很棒。

4

3 回答 3

0

如果属性绑定到特定数据类型,您需要将文本框中的值设置为该属性的有效值,然后它将更新视图模型源

似乎任何验证错误都会停止视图模型更新。我认为这是垃圾。

于 2014-07-10T11:08:14.867 回答
0

您可以在转换器的 Convert 方法中获取值:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
    value.GetType(); / *The bound object is here
}

XAML

Text="{Binding Age, Mode=TwoWay,Converter={StaticResource converterName}}"

不确定您需要在哪里访问该类型,但如果您需要转换该值,它在该级别可用。

于 2013-04-29T14:25:26.257 回答
0

我发现这样做的唯一方法是使用反射。以下代码获取绑定的对象。它还处理嵌套绑定{Binding Parent.Value},如果存在转换器 - 它返回转换后的值。对于项目为空的情况,该方法还返回项目的类型。

    private static object GetBindedItem(FrameworkElement fe, out Type bindedItemType)
    {
        bindedItemType = null;
        var exp = fe.GetBindingExpression(TextBox.TextProperty);

        if (exp == null || exp.ParentBinding == null || exp.ParentBinding.Path == null 
            || exp.ParentBinding.Path.Path == null)
            return null;

        string bindingPath = exp.ParentBinding.Path.Path;
        string[] elements = bindingPath.Split('.');
        var item = GetItem(fe.DataContext, elements, out bindedItemType);

        // If a converter is used - don't ignore it
        if (exp.ParentBinding.Converter != null)
        {
            var convOutput = exp.ParentBinding.Converter.Convert(item, 
                bindedItemType, exp.ParentBinding.ConverterParameter, CultureInfo.CurrentCulture);
            if (convOutput != null)
            {
                item = convOutput;
                bindedItemType = convOutput.GetType();
            }
        }
        return item;
    }

    private static object GetItem(object data, string[] elements, out Type itemType)
    {
        if (elements.Length == 0)
        {
            itemType = data.GetType();
            return data;
        }
        if (elements.Length == 1)
        {
            var accesor = data.GetType().GetProperty(elements[0]);
            itemType = accesor.PropertyType;
            return accesor.GetValue(data, null);
        }
        string[] innerElements = elements.Skip(1).ToArray();
        object innerData = data.GetType().GetProperty(elements[0]).GetValue(data);
        return GetItem(innerData, innerElements, out itemType);
    }
于 2015-03-17T08:59:05.087 回答