【问题标题】:Binding vs. x:Bind, using StaticResource as a default and their differences in DataContextBinding vs. x:Bind,默认使用 StaticResource 以及它们在 DataContext 中的区别
【发布时间】:2015-09-15 09:20:06
【问题描述】:

我花了半天的时间试图通过UserControl 上的DependencyProperty 配置ListViewItemTemplateUserControl。关于 Windows 10 UAP 平台上可用的两种不同的 Binding 方法(Bindingx: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>

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 一样。 x:Bind 在根页面中将值设置为EventItemTemplate 时会起作用,但当根页面未指定任何内容时,它将无法使用StaticResource 指定的默认DataTemplate。另一方面,Binding 将始终使用默认的DataTemplate,即使根页面设置了其他值EventItemTemplate

通过将RelativePanel 上的DataContext 设置为UserControl Binding 也开始像想要的那样工作。 x:Bind 仍然显示相同的行为。

现在我知道Binding 默认情况下不会绑定到UserControlDataContext,但我仍然不完全确定为什么x:Bind 不起作用。这是预期的行为还是我的整个计划有问题,我想出的只是一个幸运的技巧?

【问题讨论】:

    标签: c# xaml binding windows-10


    【解决方案1】:

    来自{x:Bind} markup extension

    {x:Bind} 标记扩展(Windows 10 的新功能)是 {Binding} 的替代品。 {x:Bind} 缺少 {Binding} 的一些功能,但它比 {Binding} 运行时间和内存更少,并且支持更好的调试。

    在 XAML 加载时,{x:Bind} 被转换为您可以认为的绑定对象,并且此对象从数据源的属性中获取值。可以选择将绑定对象配置为观察数据源属性值的变化,并根据这些变化刷新自身。它还可以选择配置为将其自身值的更改推送回源属性。 {x:Bind} 和 {Binding} 创建的绑定对象在功能上基本相同。但是 {x:Bind} 执行特殊用途的代码,它在编译时生成,而 {Binding} 使用通用的运行时对象检查。因此,{x:Bind} 绑定(通常称为已编译绑定)具有出色的性能,提供绑定表达式的编译时验证,并通过使您能够在作为部分生成的代码文件中设置断点来支持调试您的页面的类。这些文件可以在您的 obj 文件夹中找到,其名称类似于 (for C#) .g.cs。

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多