0

在这种情况下,有点想不通如何使用 WPF 绑定:

假设,我们有一个 CarInfo 类型的非简单属性的对象 Car:

public class CarInfo : DependencyObject
{
    public static readonly DependencyProperty MaxSpeedProperty =
        DependencyProperty.Register("MaxSpeed", typeof (double), typeof (CarInfo), new PropertyMetadata(0.0));

    public double MaxSpeed
    {
        get { return (double) GetValue(MaxSpeedProperty); }
        set { SetValue(MaxSpeedProperty, value); }
    }
}

public class Car : DependencyObject
{

    public static readonly DependencyProperty InfoProperty =
        DependencyProperty.Register("Info", typeof (CarInfo), typeof (Car), new PropertyMetadata(null));

    public CarInfo Info
    {
        get { return (CarInfo) GetValue(InfoProperty); }
        set { SetValue(InfoProperty, value); }
    }

}

还假设 Car 是一个 ui 元素并且它具有 Car.xaml,这很简单:

<Style TargetType="assembly:Car">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="assembly:Car">
                <Grid >
    !-->            <TextBlock Text="{Binding Path=MaxSpeed}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

所以,我希望我的 Car.xaml 中的这个 TextBlock 代表我的 CarInfo 类的属性“MaxSpeed”,它实际上是我的 Car 类的属性。我怎样才能做到这一点?

提前感谢您,感谢您的帮助!:)

4

3 回答 3

2

这取决于分配给表示 Car 的 UI 元素的 DataCONtext 的内容 - 您需要指定相对于它的绑定路径。在这种情况下,我建议你从这个开始:

<TextBlock Text="{Binding Path=Info.MaxSpeed}" />

这是假设 Car 对象已分配给 Car UI 元素的 DataContext。

请注意,您的属性不必是依赖属性 - 您也可以绑定到普通属性(取决于您在做什么)。

编辑

您似乎正在寻找使用元素绑定,因此您应该能够通过使用 TemplatedParent 或祖先作为您的相对源来实现您想要的。有关示例,请参见此以前的 SO 答案。您的绑定应如下所示:

<TextBlock Text="{Binding Path=Info.MaxSpeed, RelativeSource={RelativeSource TemplatedParent}}" />

这将带您回到模板化父控件(Car),然后沿着 UI 元素的 Info 属性向下移动到其内容的 MaxSpeed 属性。

正如我在评论中所说,通过让您的 UI 元素与您的数据元素非常匹配,然后将您的数据对象分配给 UI 元素上相对非标准的属性,您会变得非常混乱。您可能有自己的理由,但 XAML 和 WPF 不需要那么复杂。

于 2012-10-02T09:47:05.037 回答
0
<TextBlock Text="{Binding Path=Info.MaxSpeed}" />
于 2012-10-02T09:43:15.903 回答
0

该代码对我很有效:

<TextBlock Text="{Binding Path=Info.MaxSpeed, RelativeSource={RelativeSource Mode=TemplatedParent}}" />

和用法:

Car.Info = new CarInfo { MaxSpeed = 100.0 };
于 2012-10-02T10:15:46.357 回答