UWP XAML 和 C# - x:Bind 在 ResourceDictionary 内的 DataTemplate 上
UWP XAML and C# - x:Bind on a DataTemplate inside a ResourceDictionary
上下文:我正在编写 UWP Twitter 客户端。我的推文 class 的属性之一是一个名为 IsRetweet
的布尔值 - 如果推文包含转推,则将其设置为 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=" "/></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
绑定将不会呈现。
示例:
您的 App.xaml 仅合并到 ResourceDictionary 的 XAML 部分,因为这是您要求它做的全部。
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Visuals.xaml"/> <!-- Only loads XAML -->
</ResourceDictionary.MergedDictionaries>
但是,当您在数据模板中使用 x:Bind / x:Load 时,会为您的 class 创建编译器生成的代码,并且此代码永远不会加载,因为您正在加载你的 ResourceDictionary 是松散的 XAML 而不是 class.
要加载 ResourceDictionary 及其相关的编译器生成的 x:Load/x:Bind / 作为完整 class 的代码,请将 App.xaml 中的上述代码替换为:
<ResourceDictionary.MergedDictionaries>
<local:Visuals />
</ResourceDictionary.MergedDictionaries>
(此时 <Grid Grid.Row="0" x:Name="RetweetedBy" x:Load="{x:Bind IsRetweet}">
足以让它按照您的需要工作。)
上下文:我正在编写 UWP Twitter 客户端。我的推文 class 的属性之一是一个名为 IsRetweet
的布尔值 - 如果推文包含转推,则将其设置为 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=" "/></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
绑定将不会呈现。
示例:
您的 App.xaml 仅合并到 ResourceDictionary 的 XAML 部分,因为这是您要求它做的全部。
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Visuals.xaml"/> <!-- Only loads XAML -->
</ResourceDictionary.MergedDictionaries>
但是,当您在数据模板中使用 x:Bind / x:Load 时,会为您的 class 创建编译器生成的代码,并且此代码永远不会加载,因为您正在加载你的 ResourceDictionary 是松散的 XAML 而不是 class.
要加载 ResourceDictionary 及其相关的编译器生成的 x:Load/x:Bind / 作为完整 class 的代码,请将 App.xaml 中的上述代码替换为:
<ResourceDictionary.MergedDictionaries>
<local:Visuals />
</ResourceDictionary.MergedDictionaries>
(此时 <Grid Grid.Row="0" x:Name="RetweetedBy" x:Load="{x:Bind IsRetweet}">
足以让它按照您的需要工作。)