我花了半天的好努力使ListView
的ItemTemplate
與UserControl
配置通過DependencyProperty
上的方式表示UserControl
。我遇到了有關Windows 10 UAP平臺(Binding
和x:Bind
)上可用的兩種不同的Binding
方法的一些奇怪的不一致之處。綁定與X:綁定,使用靜態資源爲默認值,其在DataContext的
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
不起作用。這是有意的行爲還是我的整個計劃有什麼問題,並且我只是想到了一個幸運的黑客?