2

背景:我正在编写一个 UWP Twitter 客户端。我的 Tweet 类的属性之一是一个名为的布尔值IsRetweet- 如果推文包含转推,则将其设置为 True。

我想使用它x:Load来有条件地在我的 UI 中加载一个显示“@username retweeted”的额外行。

我要离开这个例子: https ://docs.microsoft.com/en-us/windows/uwp/xaml-platform/x-load-attribute

这是我的 XAML,它位于 ResourceDictionary 中:

<Grid Grid.Row="0" x:Name="RetweetedBy"  x:Load="{x:Bind (x:Boolean)IsRetweet, Converter={StaticResource DebugThis}}">
    <StackPanel Orientation="Horizontal" Padding="4 8 4 0">
        <StackPanel.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="FontSize" Value="12"/>
                <Setter Property="Foreground" Value="{ThemeResource SystemControlPageTextBaseMediumBrush}" />
            </Style>
        </StackPanel.Resources>
        <Border Height="28">
            <TextBlock Height="24" FontFamily="{StaticResource FontAwesome}" xml:space="preserve"><Run Text="&#xf079;&#160;"/></TextBlock>
        </Border>
        <TextBlock Text="{Binding Path=User.Name}" />
        <TextBlock Text=" retweeted"/>
    </StackPanel>
</Grid>

我在为 x:Load 绑定的字段中添加了一个名为 DebugThis 的临时转换器,如下所示:

public class DebugThis : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        bool IsRetweet = (bool)value;

        return IsRetweet;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

我在这上面设置了一个断点,我什至没有点击转换器,所以我猜我的 XAML 绑定有问题。我已经三重检查了使用此 DataTemplate 的对象,并且每个对象的IsRetweet属性设置都正确。

ETA:我可以x:Bind通过将其添加到我的 UI 页面的 XAML 来加载绑定数据:

<Page.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <tweeter:Visuals />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Page.Resources>

但是,现在如果我将新内容动态加载到 UI 中,x:Bind绑定不会呈现。

例子: 在此处输入图像描述

4

1 回答 1

3

您的 App.xaml 仅合并到您的 ResourceDictionary 的 XAML 部分,因为这就是您要求它做的所有事情。

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Visuals.xaml"/> <!-- Only loads XAML -->
</ResourceDictionary.MergedDictionaries>

但是,当您在 DataTemplates 中使用 x:Bind / x:Load 时,会为您的类创建编译器生成的代码,并且此代码永远不会被加载,因为您将 ResourceDictionary 作为松散的 XAML 而不是类加载。

要将 ResourceDictionary 及其相关的编译器生成的 x:Load/x:Bind / 代码加载为完整类,请将 App.xaml 中的上述内容替换为:

<ResourceDictionary.MergedDictionaries>
    <local:Visuals />
</ResourceDictionary.MergedDictionaries>

(此时<Grid Grid.Row="0" x:Name="RetweetedBy" x:Load="{x:Bind IsRetweet}">足以让它根据需要工作。)

于 2018-07-31T22:00:32.153 回答