我花了大半天的时间试图制作ItemTemplate
of a ListView
with a UserControl
可通过以下方式配置DependencyProperty
上说UserControl
。我遇到了关于这两种不同的一些奇怪的不一致之处Binding
Windows 10 UAP 平台上可用的方法(Binding
and x:Bind
).
The 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>
The EventItemTemplate
is a DependencyProperty
of the UserControl
.
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
and Binding
并且没有DataContext
on the RelativePanel
as the UserControl
就是现在。x:Bind
将值设置为时将起作用EventItemTemplate
在根页面,但不能使用默认的DataTemplate
由指定StaticResource
当根页面没有指定任何内容时。Binding
另一方面会使用默认值DataTemplate
在任何时候,即使根页面设置了其他值EventItemTemplate
.
通过设置DataContext
on the RelativePanel
to the UserControl
Binding
也开始像想要的那样工作。x:Bind
仍然表现出相同的行为。
现在我明白了Binding
默认情况下不绑定到UserControl
's DataContext
,但我仍然不完全确定为什么x:Bind
不起作用。这是有意的行为还是我的整个计划有问题,我想出的只是一个幸运的黑客?