WPF Label не заполнен при многократном связывании с шаблоном - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть ярлык с шаблоном, и я пытаюсь выполнить связывание, но ярлык пуст при использовании вместе с шаблоном

Ниже приведен код для ярлыка

        <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>

Может кто-нибудь подсказать, почему это не работает?

1 Ответ

0 голосов
/ 19 февраля 2019

Ваш текстовый блок является привязкой шаблона к Контенту (из метки).Тем не менее, содержимое метки никогда не устанавливается (не учитывая ваш 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";
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...