Binding vs. x: Bind, используя StaticResource по умолчанию и их различия в DataContext
Я потратил половину дня, пытаясь сделатьItemTemplate
изListView
сUserControl
настраивается с помощьюDependencyProperty
на сказалUserControl
, Я столкнулся с некоторыми странными несоответствиями в отношении двух разныхBinding
методы доступны на платформе 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
этоDependencyProperty
из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
а такжеBinding
и безDataContext
наRelativePanel
какUserControl
сейчас.x:Bind
будет функциональным при установке значения вEventItemTemplate
в корневой странице, но он не сможет использовать по умолчаниюDataTemplate
определяетсяStaticResource
когда на корневой странице ничего не указано.Binding
с другой стороны будет использовать по умолчаниюDataTemplate
всегда, даже когда на корневой странице было установлено другое значениеEventItemTemplate
.
УстановивDataContext
наRelativePanel
кUserControl
Binding
начал работать как хотел тоже.x:Bind
по-прежнему показывает то же поведение.
Теперь я понимаю, чтоBinding
по умолчанию не привязывается кUserControl
«sDataContext
, но я до сих пор не совсем уверен, почемуx:Bind
не работает Это предполагаемое поведение или что-то не так со всей моей схемой здесь, и это то, что я придумал, просто удачный взлом?