【发布时间】:2015-09-15 09:20:06
【问题描述】:
我花了半天的时间试图通过UserControl 上的DependencyProperty 配置ListView 的ItemTemplate 和UserControl。关于 Windows 10 UAP 平台上可用的两种不同的 Binding 方法(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 一样。 x:Bind 在根页面中将值设置为EventItemTemplate 时会起作用,但当根页面未指定任何内容时,它将无法使用StaticResource 指定的默认DataTemplate。另一方面,Binding 将始终使用默认的DataTemplate,即使根页面设置了其他值EventItemTemplate。
通过将RelativePanel 上的DataContext 设置为UserControl Binding 也开始像想要的那样工作。 x:Bind 仍然显示相同的行为。
现在我知道Binding 默认情况下不会绑定到UserControl 的DataContext,但我仍然不完全确定为什么x:Bind 不起作用。这是预期的行为还是我的整个计划有问题,我想出的只是一个幸运的技巧?
【问题讨论】:
标签: c# xaml binding windows-10