我正在寻找一种方法来使用XAML Binding,它不仅可以绑定DependencyProperty,还可以提供设计时视图。
我在后面的代码中有一个viewmodel对象的依赖属性:
private static DependencyProperty s_itemProperty
= DependencyProperty.Register("Item", typeof(BadgeItemViewModel), typeof(DetailPage), new PropertyMetadata(null));
public static DependencyProperty ItemProperty
{
get { return s_itemProperty; }
}
在此示例中,绑定找不到“Item”,但会给我一个后备设计时视图:
<Grid Width="100" Margin="5,20,4,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Ellipse x:Name="elipAvatar" HorizontalAlignment="Center" Height="100" Width="100" VerticalAlignment="Center">
<Ellipse.Fill>
<ImageBrush ImageSource="{Binding Item.media.badge_image_lg, FallbackValue='https://untappd.akamaized.net/badges/bdg_StPatirkcs2018_lg.jpg'}" Stretch="UniformToFill"/>
</Ellipse.Fill>
</Ellipse>
</Grid>
在这个例子中,运行时绑定x:Bind工作得很好,我可以获得对我的XAML中的“Item”对象的Intellisense访问,但我没有得到回退类型值和x:Bind一般不支持设计时数据:
<Grid Width="100" Margin="5,20,4,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Ellipse x:Name="elipAvatar" HorizontalAlignment="Center" Height="100" Width="100" VerticalAlignment="Center">
<Ellipse.Fill>
<ImageBrush ImageSource="{x:Bind Item.media.badge_image_lg, TargetNullValue='https://untappd.akamaized.net/badges/bdg_StPatirkcs2018_lg.jpg'}" Stretch="UniformToFill"/>
</Ellipse.Fill>
</Ellipse>
</Grid>
是否有可能获得妥协,我不仅可以访问XAML中的Item viewmodel对象,还可以为Image提供设计时视图或至少后备值?
谢谢, 瑞克
答案 0 :(得分:0)
是否有可能获得妥协,我不仅可以访问XAML中的Item viewmodel对象,还可以为Image提供设计时视图或至少后备值?
您似乎无法访问XAML中的Item viewmodel对象,并且还为此方案中的Image提供了设计时视图或至少后备值。
默认情况下,{Binding}会假定您已绑定到标记页的 DataContext 。 DataContext 属性,其类型为Object,并且在运行时也可能会更改。当您使用{Binding}时,在设计时,Visual Studio无法识别DataModel类型,因此您无法找到&#34; Item&#34;和它在xaml上的属性。另一方面,FallbackValue属性用于获取或设置当绑定无法返回值时使用的值,如果绑定路径正确并返回值, FallbackValue 不会显示。您可以尝试重建项目并提供错误的路径以查看FallbackValue。
{x:Bind}不使用DataContext作为默认源 - 而是使用页面或用户控件本身。因此,它将查看页面或用户控件的代码隐藏属性,字段和方法。如果代码中的Item
对象落后,您可以访问它及其属性。但是源uri是在ViewModel代码中,Visual Studio仍然无法获取资源。同时, TargetNullValue 和 FallbackValue 也会在{x:Bind} markup extension中引入,您可以查看它。
更多详情,请参阅{Binding} markup extension和{x:Bind} markup extension。