首页 > 解决方案 > 如何在代码中使用多重绑定重新创建 TextBlock 样式?

问题描述

这是我为TextBlockWPF 应用程序提供的 XAML 代码。这与我当前的数据绑定工作得很好。

<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Black" FontSize="32" FontWeight="Bold">
                                <TextBlock.Style>
                                    <Style TargetType="TextBlock" BasedOn="{StaticResource InvisibleTextBlock}">
                                        <Style.Triggers>
                                            <DataTrigger Binding="{Binding MatchModel.TeamARightEnd}" Value="True">
                                                <Setter Property="Text">
                                                    <Setter.Value>
                                                        <MultiBinding StringFormat="{}{0} - {1}">
                                                            <Binding Path="TeamBScore"/>
                                                            <Binding Path="TeamAScore"/>
                                                        </MultiBinding>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                            <DataTrigger Binding="{Binding MatchModel.TeamARightEnd}" Value="False">
                                                <Setter Property="Text">
                                                    <Setter.Value>
                                                        <MultiBinding StringFormat="{}{0} - {1}">
                                                            <Binding Path="TeamAScore"/>
                                                            <Binding Path="TeamBScore"/>
                                                        </MultiBinding>
                                                    </Setter.Value>
                                                </Setter>
                                            </DataTrigger>
                                        </Style.Triggers>
                                    </Style>
                                </TextBlock.Style>
                            </TextBlock>

现在我需要动态创建几个这样的文本块并将它们添加到StackPanel. 我成功地重新创建了它:

TextBlock scoretextblock = new()
            {
                Name = "TextBlockScore" + i,
                HorizontalAlignment = HorizontalAlignment.Center,
                VerticalAlignment = VerticalAlignment.Center,
                Foreground = new SolidColorBrush(Colors.Black),
                FontSize = 32,
                FontWeight = FontWeights.Bold,
            };
            scoretextblock.Style = new()
            {
                TargetType = typeof(TextBlock),
                Triggers =
                {
                    new DataTrigger
                    {
                        Value = true,
                        Binding = new Binding("MatchModel.TeamARightEnd"),
                        Setters =
                        {
                            new Setter
                            {
                                Property = TextBlock.TextProperty,
                                Value = new Binding("TeamAScore") + " - " + new Binding("TeamBScore")
                            }
                        }
                    }
                }
            };

在执行过程中,我成功找到了上面TextBlock的s,并且可以更改datacontext。但是,显示的所需结果为空白。有谁知道我做错了什么?或者有没有办法TextBlock在 XAML 本身中动态地重新创建这些?

谢谢!!

标签: .netwpfxamldata-binding

解决方案


的应该设置为 a Value,例如:SetterMultiBinding

DataTrigger dataTrigger = new DataTrigger() { Value = true, Binding = new Binding("MatchModel.TeamARightEnd") };
MultiBinding multiBinding = new MultiBinding()
{
    StringFormat = "{0} - {1}"
};
multiBinding.Bindings.Add(new Binding("TeamAScore"));
multiBinding.Bindings.Add(new Binding("TeamBScore"));
dataTrigger.Setters.Add(new Setter() { Property = TextBlock.TextProperty, Value = multiBinding });

Style style = new Style() { TargetType = typeof(TextBlock) };
style.Triggers.Add(dataTrigger);

TextBlock scoretextblock = new TextBlock()
{
    Name = "TextBlockScore" + i,
    HorizontalAlignment = HorizontalAlignment.Center,
    VerticalAlignment = VerticalAlignment.Center,
    Foreground = new SolidColorBrush(Colors.Black),
    FontSize = 32,
    FontWeight = FontWeights.Bold,
    Style = Style
};

推荐阅读