ich das besser von einem halben Tag verbracht habe versucht, die ItemTemplate
ein ListView
mit einem UserControl
konfigurierbar durch mittels einem DependencyProperty
auf dem machen UserControl
. Ich habe einige seltsame Inkonsistenzen in Bezug auf die zwei verschiedenen Binding
Methoden auf Windows 10 UAP-Plattform (Binding
und x:Bind
) gefunden. Die UserControl
sieht wie folgt aus und ist Teil einer benutzerdefinierten Kalenderkomponente.Bindung vs. x: Binden, mit Static als Standard und deren Unterschiede in Datacontext
<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>
Die EventItemTemplate
ist ein DependencyProperty
des 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));
, die auf einer der Wurzelseiten geändert wird, um die ListView
in der einen oder der anderen, wie so stylen.
<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>
Dies ist eigentlich eine funktionierende Version, aber ich musste ziemlich viel herum basteln. Die ersten Versuche wurden von mir sowohl mit x:Bind
als auch Binding
und ohne die DataContext
über die RelativePanel
als UserControl
gemacht. x:Bind
wäre funktional, wenn auf der Root-Seite ein Wert auf EventItemTemplate
gesetzt wird, aber es wäre nicht in der Lage, den Standardwert DataTemplate
zu verwenden, der von StaticResource
angegeben wurde, wenn die Stammseite nichts angegeben hat. Binding
auf der anderen Seite würde die Standardeinstellung DataTemplate
jederzeit verwenden, auch wenn die Root-Seite einen anderen Wert auf EventItemTemplate
gesetzt hatte.
Durch die Einstellung der DataContext
über die RelativePanel
an die UserControl
Binding
gestartet funktioniert wie wollte es auch. x:Bind
zeigt immer noch das gleiche Verhalten.
Jetzt verstehe ich, dass Binding
nicht standardmäßig binden an die UserControl
‚s DataContext
, aber ich bin immer noch nicht ganz sicher, warum x:Bind
funktioniert nicht. Ist das beabsichtigte Verhalten oder stimmt etwas mit meinem gesamten Schema hier nicht überein und ist es, was ich nur mit einem glücklichen Hack gemacht habe?