Ben DependencyProperty
üzerinde vasıtası ile UserControl
yapılandırılabilir bir ListView
ait ItemTemplate
yapmaya çalışıyorum yarım gün daha iyi geçirdim UserControl
söyledi . Windows 10 UAP platformunda (Binding
ve x:Bind
) bulunan iki farklı Binding
yöntemiyle ilgili bazı garip tutarsızlıklar görüyorum.vs x Binding: Bind, bir varsayılan ve DataContext'i
UserControl
buna benzer ve özel bir takvim bileşeninin parçasıdır.
<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
bir DependencyProperty
olup.
ListView
stil kök sayfalarından birinde değişir
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));
.
<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>
Bu aslında çalışan bir sürümdür, ancak bununla biraz uğraşmak zorunda kaldım. İlk denemeler x:Bind
ve Binding
hem de RelativePanel
olmadan UserControl
şimdi tarafından yapıldı. Kök sayfada için bir değer ayarlandığında x:Bind
işlevsel olurdu, ancak kök sayfa hiçbir şey belirtmediğinde StaticResource
tarafından belirtilen varsayılan DataTemplate
kullanmak mümkün olmaz. Binding
ise, EventItemTemplate
için başka bir değer ayarlamış olsa bile, varsayılan DataTemplate
'u her zaman kullanır.
DataContext
'u RelativePanel
üzerinde UserControl
Binding
olarak ayarlamaya başlamak istediğiniz gibi çalıştı. x:Bind
hala aynı davranışı göstermektedir.
Şimdi Binding
UserControl
'ın DataContext
varsayılan bağlama olarak sahip değildir anlıyoruz, ama yine de x:Bind
çalışmıyor neden tamamen emin değilim. Bu planlanmış bir davranış mı yoksa tüm planımla ilgili yanlış bir şey mi var ve ne kadar şanslı bir hack ile geldim? {x:Bind} markup extension kaynaktan