我花了半天时间尝试使用
这实际上是一个可用的版本,但我不得不对它进行一些调整。最初,我尝试了使用
通过将
现在我明白了,默认情况下,
DependencyProperty
使带有 UserControl
的 ListView
的 ItemTemplate
可配置。在 Windows 10 UAP 平台上,我遇到了一些奇怪的不一致性,涉及两种不同的绑定方法(Binding
和 x:Bind
)。这个 UserControl
如下所示,并且是自定义日历组件的一部分。
<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
是 UserControl
的一个 DependencyProperty
。public 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));
其中一个根页面上的内容被修改,以某种方式样式化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
和Binding
,并且在RelativePanel
上没有使用DataContext
,就像现在的UserControl
一样。当在根页面中为EventItemTemplate
设置值时,x:Bind
会正常工作,但当根页面没有指定任何内容时,它将无法使用由StaticResource
指定的默认DataTemplate
。另一方面,Binding
始终会使用默认的DataTemplate
,即使根页面已经为EventItemTemplate
设置了其他值。通过将
RelativePanel
上的DataContext
设置为UserControl
,Binding
可以按照预期工作。但x:Bind
仍然显示相同的行为。现在我明白了,默认情况下,
Binding
不会绑定到UserControl
的DataContext
,但我仍然不完全确定为什么x:Bind
不起作用。这是预期的行为还是我的整个方案存在问题,而我想出的只是一个幸运的hack?