У меня есть метка с шаблоном, и я пытаюсь выполнить множественную привязку, но метка пуста при использовании в сочетании с шаблоном.
Ниже приведен код для ярлыка
<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>
Может ли кто-нибудь дать мне подсказку, почему это не работает?
И когда у вас есть <TextBlock Text = "{TemplateBinding Content}"/> в шаблоне, вы, конечно, не можете установить Content в другой TextBlock. Единственным допустимым содержимым является строка.
@Clemens Я попытался установить свойство содержимого с помощью Label.Content, но результат тот же. Кроме того, попытался удалить Text = "{TemplateBinding Content}" и та же проблема.
К сожалению, MultiBinding с StringFormat работает, только если целевое свойство имеет строковый тип. Вы должны были видеть сообщения об ошибках привязки в окне вывода в Visual Studio. Вместо этого вы можете использовать MultiBinding Converter.
@ Клеменс Спасибо.





Ваш текстовый блок является привязкой шаблона к содержимому (из метки). Однако содержимое метки никогда не устанавливается (не учитывая ваш 3-й блок кода, который устанавливает его в TextBlock - не строку, а фактический TextBlock).
Итак, устанавливаем метку Content. Вы можете использовать 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";
}
}
}
Спасибо, я не знал о IMultiValueConverter, иначе я попробовал приведенный выше код.
Свойство Text блока TextBlock в шаблоне метки привязано к свойству содержимого метки, но стиль метки устанавливает
TextBlock.Text. Кажется, это не имеет смысла. Вместо этого Style следует установить свойство Content.