绑定与x:绑定,使用StaticResource作为默认值以及它们在DataContext中的差异

时间:2015-09-15 09:20:07

标签: c# xaml binding windows-10

我已经花了半天的时间,尝试通过ItemTemplate ListView配置UserControlDependencyProperty UserControl Binding Binding 1}}。关于Windows 10 UAP平台(x:BindUserControl)上可用的两种<UserControl x:Class="FlowDesigner.UserControls.CalendarDayView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:FlowDesigner.UserControls" xmlns:vw="using:FlowDesigner.ViewModels" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:uc="using:FlowDesigner.UserControls" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400" x:Name="DateControl"> <UserControl.Resources> <DataTemplate x:Key="DefaultDataTemplate" x:DataType="vw:Event" > <uc:EventListTemplate IsToday="{Binding Date, Converter={StaticResource IsTodayConverter}}" Date="{Binding Date, Mode=OneWay}" Summary="{Binding Path=Summary, Mode=OneWay}" /> </DataTemplate> </UserControl.Resources> <RelativePanel Background="White" BorderBrush="Black" BorderThickness="1" DataContext="{Binding ElementName=DateControl}"> <TextBlock x:Name="DayText" TextAlignment="Center" VerticalAlignment="Center" /> <TextBlock x:Name="MonthText" TextAlignment="Center" VerticalAlignment="Center" RelativePanel.RightOf="DayText" /> <ListView x:Name="EventList" ItemsSource="{x:Bind Events, Mode=OneWay}" ItemTemplate="{Binding Path=EventItemTemplate, Mode=OneWay, FallbackValue={StaticResource DefaultDataTemplate}, TargetNullValue={StaticResource DefaultDataTemplate}}" RelativePanel.Below="DayText" RelativePanel.AlignLeftWithPanel="True" RelativePanel.AlignRightWithPanel="True"> </ListView> </RelativePanel> </UserControl> 方法,我遇到了一些奇怪的不一致。

EventItemTemplate看起来像这样,是自定义日历组件的一部分。

DependencyProperty

UserControlpublic DataTemplate EventItemTemplate { get { return (DataTemplate)GetValue(EventItemTemplateProperty); } set { SetValue(EventItemTemplateProperty, value); } } public static readonly DependencyProperty EventItemTemplateProperty = DependencyProperty.Register("EventItemTemplate", typeof(DataTemplate), typeof(CalendarDayView), new PropertyMetadata(null)); 的{​​{1}}。

ListView

在其中一个根页面上改变了哪种方式,以某种方式设置<Style TargetType="uc:CalendarDayView"> <Setter Property="EventItemTemplate"> <Setter.Value> <DataTemplate x:DataType="vw:Event" > <TextBlock Text="{Binding Summary, Mode=OneWay}" /> </DataTemplate> </Setter.Value> </Setter> </Style> 的样式,就像这样。

x:Bind

这实际上是一个工作版本,但我不得不修补它。第一次尝试是由我BindingDataContext进行的,RelativePanel上的UserControlx:Bind,现在EventItemTemplate。在根页面中将值设置为DataTemplate时,StaticResource可以正常运行,但在根页面时,它将无法使用Binding指定的默认DataTemplate没有指明任何东西。另一方面,EventItemTemplate将始终使用默认的DataContext,即使根页面设置了RelativePanel的其他值也是如此。

通过将UserControl上的Binding设置为x:Bind Binding,开始工作就像想要的那样。 UserControl仍然显示相同的行为。

现在我知道DataContext默认情况下不会绑定到x:Bind的{​​{1}},但我仍然不完全确定为什么myWebView.setWebViewClient(new WebViewClient() { @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { if (/*has internet*/) { WebResourceResponse resultFromInternet = super.shouldInterceptRequest(view, request); // store result to internet return resultFromInternet; } else { // return resource from local cache return new WebResourceResponse(...); } } }); 不起作用。这是预期的行为,还是我的整个计划出现了问题,而这只是我想出的一个幸运的黑客行为?

1 个答案:

答案 0 :(得分:10)

来自{x:Bind} markup extension

  

Windows 10的{x:Bind}标记扩展名 - 是{Binding}的替代品。 {x:Bind}缺少{Binding}的一些功能,但它比{Binding}在更短的时间和更少的内存中运行,并支持更好的调试。

     

在XAML加载时,{x:Bind}被转换为您可以认为是绑定对象的内容,并且此对象从数据源上的属性获取值。可以选择将绑定对象配置为观察数据源属性值的更改,并根据这些更改自行刷新。它还可以选择配置为将其自身值的更改推送回源属性。 {x:Bind}和{Binding}创建的绑定对象在功能上大致相同。但是{x:Bind}执行它在编译时生成的专用代码,而{Binding}使用通用运行时对象检查。因此,{x:Bind}绑定(通常称为编译绑定)具有很好的性能,提供绑定表达式的编译时验证,并支持调试,使您能够在作为部分生成的代码文件中设置断点您的页面的课程。这些文件可以在obj文件夹中找到,其名称类似于(对于C#).g.cs。