2015-09-15 10 views
5
onların farklılıkları gibi StaticResource kullanılarak

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> 

EventItemTemplateUserControl bir DependencyProperty olup.

şöyle bir yol ya da diğer 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 UserControlBinding olarak ayarlamaya başlamak istediğiniz gibi çalıştı. x:Bind hala aynı davranışı göstermektedir.

Şimdi BindingUserControl 'ı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

cevap

8

:

{x: Cilt} uzantısı yeni Windows için biçimlendirme {Binding} alternatif 10 olduğu. {x: Bind}, {Binding} öğesinin bazı özelliklerinden yoksundur, ancak {Binding} uygulamasından daha az zaman ve daha az bellekle çalışır ve daha iyi hata ayıklamayı destekler.

XAML yükleme süresinde, {x: Bind}, bağlama nesnesi olarak düşünebildiğinize dönüştürülür ve bu nesne, bir veri kaynağındaki bir özellikten değer alır. Bağlama nesnesi, isteğe bağlı olarak, veri kaynağı özelliğinin değerindeki değişiklikleri gözlemlemek ve bu değişikliklere dayanarak kendini yenilemek üzere yapılandırılabilir. İsteğe bağlı olarak, kendi değerindeki değişiklikleri kaynak özelliğine geri itecek şekilde yapılandırılabilir. {X: Bind} ve {Binding} tarafından oluşturulan bağlama nesneleri büyük ölçüde işlevsel olarak eşdeğerdir. Ancak {x: Bind}, derleme zamanında oluşturduğu özel amaçlı kod yürütür ve {Binding}, genel amaçlı çalışma zamanı nesnesi denetimini kullanır. Sonuç olarak, {x: Bind} bağlamaları (çoğunlukla derlenmiş bağlamalar olarak adlandırılır) mükemmel performansa sahiptir, ciltleme ifadelerinizin derleme zamanı doğrulamasını sağlar ve kısmi olarak oluşturulan kod dosyalarında kesme noktalarını ayarlamanızı sağlayarak hata ayıklamayı destekler sayfanız için sınıf.Bu dosyalar obj klasörünüzde (C#) .g.cs gibi adlarla bulunabilir.