我有一个带有模板的标签,我正在尝试进行多重绑定,但是当与模板结合使用时,该标签为空
以下是标签的代码
<Label Template="{StaticResource SmallHeaderTemplate}" Margin="0,10,5,0" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" >
<Label.Style>
<Style>
<Setter Property="TextBlock.Text">
<Setter.Value>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Source="{x:Static res:Strings.Val1}"></Binding>
<Binding Source="{x:Static res:Strings.Val2}"></Binding>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</Label.Style>
</Label>
模板是
<ControlTemplate x:Key="SmallHeaderTemplate" TargetType="{x:Type ContentControl}">
<StackPanel SnapsToDevicePixels="True">
<TextBlock Foreground="#FF0072C6" FontSize="20" FontWeight="Regular" FontFamily="Segoe UI Light" Text="{TemplateBinding Content}" Margin="2,7,2,5" SnapsToDevicePixels="True" />
<Border Height="1" Margin="0,0,0,5">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0" Color="#FFFCFCFC" />
<GradientStop Offset="0.5" Color="#FFD7D7D7" />
<GradientStop Offset="1" Color="#FFFCFCFC" />
</LinearGradientBrush>
</Border.Background>
</Border>
</StackPanel>
</ControlTemplate>
我也尝试了Label,但没有运气
<Label Template="{StaticResource SmallHeaderTemplate}" Margin="0,10,5,0" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" >
<Label.Content>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Source="{x:Static res:Strings.Val1}"></Binding>
<Binding Source="{x:Static res:Strings.Val2}"></Binding>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</Label.Content>
</Label>
谁能给我一个提示,为什么它不起作用?
答案 0 :(得分:1)
您的文本块是绑定到Content(来自标签)的模板。标签内容永远不会设置(忽略您将其设置为TextBlock的第三个代码块,而不是字符串,而是实际的TextBlock)。
因此,设置标签内容。您只能将StringFormat与字符串一起使用(Label.Content不是字符串)。因此,请使用转换器进行格式化(在这种情况下为MultiBinding)。
这是一个有效的示例: XAML:
<Window x:Class="WpfApp34.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:res="clr-namespace:WpfApp34.Statics"
xmlns:local="clr-namespace:WpfApp34"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<local:MyConverter x:Key="MyConverter" />
<ControlTemplate x:Key="SmallHeaderTemplate" TargetType="{x:Type ContentControl}">
<StackPanel SnapsToDevicePixels="True">
<TextBlock Foreground="#FF0072C6" FontSize="20" FontWeight="Regular" FontFamily="Segoe UI Light" Text="{TemplateBinding Content}" Margin="2,7,2,5" SnapsToDevicePixels="True" />
<Border Height="1" Margin="0,0,0,5">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
<GradientStop Offset="0" Color="#FFFCFCFC" />
<GradientStop Offset="0.5" Color="#FFD7D7D7" />
<GradientStop Offset="1" Color="#FFFCFCFC" />
</LinearGradientBrush>
</Border.Background>
</Border>
</StackPanel>
</ControlTemplate>
</Window.Resources>
<Grid>
<Label Template="{StaticResource SmallHeaderTemplate}" Margin="0,10,5,0" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
<Label.Content>
<MultiBinding Converter="{StaticResource MyConverter}" ConverterParameter="{}{0} {1}">
<Binding Source="{x:Static res:Strings.Val1}" />
<Binding Source="{x:Static res:Strings.Val2}" />
</MultiBinding>
</Label.Content>
</Label>
</Grid>
代码:
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace WpfApp34
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
public class MyConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return string.Format(parameter as string, values);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
namespace Statics
{
public class Strings
{
public static string Val1 { get; set; } = "Val_1";
public static string Val2 { get; set; } = "Val_2";
}
}
}