0

我有一个具有多个属性的对象。其中两个用于控制目标文本框的宽度和高度。这是一个简单的例子......

<DataTemplate DataType="{x:Type proj:SourceObject}">
    <TextBox Width="{Binding ObjWidth}" Height="{Binding ObjHeight}"/>
</DataTemplate>

我还想绑定 TextBox 的 Text 属性。要绑定的实际属性不是固定的,而是在 SourceObject 的字段中命名。所以理想情况下我想这样做......

<DataTemplate DataType="{x:Type proj:SourceObject}">
    <TextBox Width="{Binding ObjWidth}" Height="{Binding ObjHeight}"
             Text="{Binding Path={Binding ObjPath}"/>
</DataTemplate>

这里的 ObjPath 是一个字符串,它返回对绑定完全有效的路径。但这不起作用,因为您不能对 Binding.Path 使用绑定。有什么想法可以实现同样的目标吗?

对于更多上下文,我将指出 SourceObject 是用户可自定义的,因此 ObjPath 可以随着时间的推移而更新,因此我不能简单地将固定路径放在数据模板中。

4

1 回答 1

1

您可以实现一个IMultiValueConverter并将其用作BindingConverter您的文本属性。但是你有一个问题,Textbox只有当你的属性改变(路径本身)时,值才会更新ObjPath,而不是路径指向的值。如果是这样,那么您可以BindingConverter使用反射来返回绑定路径的值。

class BindingPathToValue : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value[0] is string && value[1] != null)
        {
            // value[0] is the path
                    // value[1] is SourceObject
            // you can use reflection to get the value and return it
            return value[1].GetType().GetProperty(value.ToString()).GetValue(value[1], null).ToString();
        }
        return null;
    }

    public object[] ConvertBack(object value, Type[], object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在您的资源中有转换器:

<proj:BindingPathToValue x:Key="BindingPathToValue" />

并在 XAML 中使用它:

<DataTemplate DataType="{x:Type proj:SourceObject}">
    <TextBox Width="{Binding ObjWidth}" Height="{Binding ObjHeight}">
        <TextBox.Text>
            <MultiBinding Mode="OneWay" Converter="{StaticResource BindingPathToValue}">
                <Binding Mode="OneWay" Path="ObjPath" />
                <Binding Mode="OneWay" Path="." />
            </MultiBinding>
        </TextBox.Text>
    </TextBox>
</DataTemplate>
于 2012-08-16T07:25:10.753 回答