绑定与x:绑定,使用StaticResource作为默认值以及它们在DataContext中的差异

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绑定与x:绑定,使用StaticResource作为默认值以及它们在DataContext中的差异相关的知识,希望对你有一定的参考价值。

我花了半天时间试图用ItemTemplate制作一个ListViewUserControl,可以通过DependencyProperty上的UserControl进行配置。关于Windows 10 UAP平台(BindingBinding)上可用的两种不同的x: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>

EventItemTemplateDependencyPropertyUserControl

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以及DataContext上没有RelativePanel的第一次尝试是由于UserControl现在。在根页面中为x:Bind设置值时,EventItemTemplate将起作用,但当根页面未指定任何内容时,它将无法使用DataTemplate指定的默认StaticResource。另一方面,Binding将始终使用默认的DataTemplate,即使根页面设置了EventItemTemplate的其他值。

通过将DataContext上的RelativePanel设置为UserControl Binding开始工作就像想要它一样。 x:Bind仍然表现出相同的行为。

现在我明白Binding默认不会绑定到UserControlDataContext,但我仍然不完全确定为什么x:Bind不起作用。这是预期的行为,还是我的整个计划出现了问题,是我想出的一个幸运的黑客行为?

答案

来自{x:Bind} markup extension

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

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

以上是关于绑定与x:绑定,使用StaticResource作为默认值以及它们在DataContext中的差异的主要内容,如果未能解决你的问题,请参考以下文章

将 datacontext 字符串属性绑定到 StaticResource 键

绑定 Binding Path=.,Binding.,Binding Source={StaticResource ResourceKey="Hello"} xmlns:sys=

WPF引用资源报错

在 post .net Core Razor 页面上与数据绑定模型作斗争

DataGrid绑定DataTable出错

如何让两种方式的数据绑定在 blazor 中工作?