在这种情况下,有点无法弄清楚如何使用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类的属性。我怎么能这样做?
提前感谢您,感谢任何帮助! :)
答案 0 :(得分:2)
它取决于分配给表示Car的UI元素的DataCOntext的内容 - 您需要指定相对于该元素的绑定路径。在这种情况下,我建议你从这开始:
<TextBlock Text="{Binding Path=Info.MaxSpeed}" />
这假设已将Car对象分配给Car UI元素的DataContext。
请注意,您的属性不必是依赖项属性 - 您还可以绑定到普通属性(取决于您正在执行的操作)。
您似乎希望使用元素绑定,因此您应该能够通过使用TemplatedParent或祖先作为相对来源来实现您想要的效果。有关示例,请参阅this previous SO answer。你的绑定应该是这样的:
<TextBlock Text="{Binding Path=Info.MaxSpeed, RelativeSource={RelativeSource TemplatedParent}}" />
这会将您带回模板化的父控件(Car),然后沿UI元素的Info属性向下移动到其内容的MaxSpeed属性。
正如我在评论中所说,通过让您的UI元素与您的数据元素紧密匹配,然后将您的数据对象分配给UI元素上相对非标准的属性,您就会变得非常混乱。你可能有自己的理由,但XAML和WPF并不需要那么复杂。
答案 1 :(得分:0)
<TextBlock Text="{Binding Path=Info.MaxSpeed}" />
答案 2 :(得分:0)
该代码适用于我:
<TextBlock Text="{Binding Path=Info.MaxSpeed, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
和用法:
Car.Info = new CarInfo { MaxSpeed = 100.0 };