2015-09-15 2 views
5

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 UserControlBinding 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?

Antwort

8

Von {x:Bind} markup extension:

Die {x: Bind} Markup Erweiterung neuer für Windows 10 ist eine Alternative zum {Binding}. {x: Bind} verfügt nicht über einige der Funktionen von {Binding}, aber es läuft in weniger Zeit und weniger Arbeitsspeicher als {Binding} und unterstützt ein besseres Debugging.

Bei der XAML-Ladezeit wird {x: Bind} in das umgewandelt, was Sie sich als bindendes Objekt vorstellen können, und dieses Objekt erhält einen Wert aus einer Eigenschaft einer Datenquelle. Das Bindungsobjekt kann optional so konfiguriert werden, dass Änderungen des Werts der Datenquelleneigenschaft beobachtet und basierend auf diesen Änderungen aktualisiert werden. Optional kann es auch so konfiguriert werden, dass Änderungen seines eigenen Werts zurück in die source -Eigenschaft verschoben werden. Die von {x: Bind} und {Binding} erzeugten Bindungsobjekte sind weitgehend funktional äquivalent. Aber {x: Bind} führt Spezial-Code aus, den er zur Kompilierungszeit generiert, und {Binding} verwendet eine allgemeine Laufzeit-Objektinspektion. Folglich weisen {x: Bind} -Bindungen (oft als kompilierte Bindungen bezeichnet) eine hohe Leistung auf, bieten eine Kompilierungsvalidierung für Ihre Bindungsausdrücke und unterstützen das Debugging, indem Sie in den als partiell erzeugten Codedateien Haltepunkte setzen können Klasse für Ihre Seite.Diese Dateien befinden sich in Ihrem obj-Ordner mit Namen wie (für C#) .g.cs.