2015-09-15 72 views
5
差異

我花了半天的好努力使ListViewItemTemplateUserControl配置通過DependencyProperty上的方式表示UserControl 。我遇到了有關Windows 10 UAP平臺(Bindingx:Bind)上可用的兩種不同的Binding方法的一些奇怪的不一致之處。綁定與X:綁定,使用靜態資源爲默認值,其在DataContext的

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> 

EventItemTemplateUserControlDependencyProperty

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:BindBinding,並且RelativePanel上沒有DataContext,因爲現在UserControl。當在根頁面中將值設置爲EventItemTemplate時,x:Bind將起作用,但當根頁面未指定任何內容時,它將無法使用由StaticResource指定的默認DataTemplate。另一方面,Binding將始終使用默認的DataTemplate,即使當根頁面設置了其他值爲EventItemTemplate時也是如此。

通過將RelativePanel上的DataContext設置爲UserControlBinding開始像想要它一樣工作。 x:Bind仍然顯示相同的行爲。

現在我明白了Binding默認情況下不綁定到UserControlDataContext,但我仍然不能完全肯定爲什麼x:Bind不起作用。這是有意的行爲還是我的整個計劃有什麼問題,並且我只是想到了一個幸運的黑客?

回答

8

{x:Bind} markup extension

的{X:綁定}標記擴展新的Windows 10是{結合}的替代方案。 {x:Bind}缺少{Binding}的一些功能,但它比{Binding}更少的時間和更少的內存運行,並且支持更好的調試。

在XAML加載時,將{x:Bind}轉換爲您可以認爲是綁定對象的內容,並且此對象從數據源上的屬性獲取值。綁定對象可以選擇配置爲觀察數據源屬性值的更改並基於這些更改自行刷新。它也可以選擇配置爲將其自己的值的更改推回到源屬性。由{x:Bind}和{Binding}創建的綁定對象在功能上大致相同。但{x:Bind}執行在編譯時生成的專用代碼,{Binding}使用通用運行時對象檢查。因此,{x:Bind}綁定(通常稱爲編譯綁定)具有很高的性能,可爲您的綁定表達式提供編譯時驗證,並支持您通過在代碼文件中設置斷點來支持調試班級爲您的頁面。這些文件可以在您的obj文件夾中找到,其名稱(如C#).g.cs。