UWP XAML和C#-x:绑定到ResourceDictionary内部的DataTemplate

时间:2018-07-31 19:07:21

标签: c# uwp uwp-xaml xaml-binding

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

我想与x:Load一起使用,以便有条件地在我的UI中加载显示“ @username转推”的额外行。

我要关闭此示例: 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:通过将其添加到我的UI页面的XAML中,我可以获得x:Bind来加载绑定数据:

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

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

示例: enter image description here

1 个答案:

答案 0 :(得分:2)

您的App.xaml仅合并到ResourceDictionary的XAML部分中,因为这就是您要执行的所有操作。

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

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

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

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

(此时<Grid Grid.Row="0" x:Name="RetweetedBy" x:Load="{x:Bind IsRetweet}">足以使其按需工作。)