连接字符串,而不使用一堆TextBlocks


88

我想在WPF ItemsControl中显示Customer对象的列表。我为此创建了一个DataTemplate:

    <DataTemplate DataType="{x:Type myNameSpace:Customer}">
        <StackPanel Orientation="Horizontal" Margin="10">
            <CheckBox"></CheckBox>
            <TextBlock Text="{Binding Path=Number}"></TextBlock>
            <TextBlock Text=" - "></TextBlock>
            <TextBlock Text="{Binding Path=Name}"></TextBlock>
        </StackPanel>
    </DataTemplate>

因此,我基本上想要的是一个简单的列表(带有复选框),其中包含NUMBER-NAME。没有办法直接在绑定部分中连接数字和名称吗?

Answers:


171

有StringFormat属性(在.NET 3.5 SP1中),您可能可以使用。和有用的WPF绑定作弊鞘可以在这里找到。如果没有帮助,则可以始终为对象编写自己的ValueConverter或自定义属性。

刚刚选中,您可以将StringFormat与multibinding一起使用。在您的情况下,代码将如下所示:

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat=" {0} - {1}">
        <Binding Path="Number"/>
        <Binding Path="Name"/>
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

我必须以空格开头的格式字符串,否则Visual Studio无法构建,但是我想您会找到解决方法的方法:)

编辑
StringFormat中需要有空格,以防止将解析器{0}视为实际绑定。其他选择:

<!-- use a space before the first format -->
<MultiBinding StringFormat=" {0} - {1}">

<!-- escape the formats -->
<MultiBinding StringFormat="\{0\} - \{1\}">

<!-- use {} before the first format -->
<MultiBinding StringFormat="{}{0} - {1}">

29
您可以使用{}代替空格,例如StringFormat =“ {} {0}-{1}”
Bryan Anderson,2009年

6
您还可以使用反斜杠转义花括号:<MultiBinding StringFormat =“ \ {0 \}-\ {1 \}”>
hughdbrown

另外,缺少结尾的TextBlock,因此可以总结以下注释:<TextBlock> <TextBlock.Text> <MultiBinding StringFormat =“ {} {0}-{1}”> <Binding Path =“ Number” /> <Binding Path =“ Name” /> </ MultiBinding> </TextBlock.Text> </ TextBlock>
TJKjaer 2010年

@PiRX如果我想显示“数字”,即使“名称”为空,我该怎么做?
达斯达斯,2015年

不幸的是,@ DasDas我无法为您的问题提供帮助,因为我已经与WPF多年没有合作了。有趣的是,您很快就忘记了不再使用的东西。
PiRX

64

如果要使用静态文本连接动态值,请尝试以下操作:

<TextBlock Text="{Binding IndividualSSN, StringFormat= '\{0\} (SSN)'}"/>

显示:234-334-5566(SSN)


1
TextBlockLeftStyle的内容是什么?
itsho 2013年

这是一种自定义样式,我必须将文本块向左对齐。在这里没有意义。
redskull 2013年

1
这是将绑定与字符串连接的最佳解决方案
Devid,

8

请参阅以下我在使用Run类的代码中使用的示例:

        <TextBlock x:Name="..." Width="..." Height="..."
            <Run Text="Area="/>
            <Run Text="{Binding ...}"/>
            <Run Text="sq.mm"/>
            <LineBreak/>
            <Run Text="Min Diameter="/>
            <Run Text="{Binding...}"/>
            <LineBreak/>
            <Run Text="Max Diameter="/>
            <Run Text="{Binding...}"/>
        </TextBlock >

3

您还可以使用可绑定运行。有用的东西,特别是如果要添加一些文本格式(颜色,字体粗细等)的东西。

<TextBlock>
   <something:BindableRun BoundText="{Binding Number}"/>
   <Run Text=" - "/>
   <something:BindableRun BoundText="{Binding Name}"/>
</TextBlock>

是原始课程:
是一些其他改进。
这就是所有代码中的一部分:

public class BindableRun : Run
    {
        public static readonly DependencyProperty BoundTextProperty = DependencyProperty.Register("BoundText", typeof(string), typeof(BindableRun), new PropertyMetadata(new PropertyChangedCallback(BindableRun.onBoundTextChanged)));

        private static void onBoundTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            ((Run)d).Text = (string)e.NewValue;
        }

        public String BoundText
        {
            get { return (string)GetValue(BoundTextProperty); }
            set { SetValue(BoundTextProperty, value); }
        }

        public BindableRun()
            : base()
        {
            Binding b = new Binding("DataContext");
            b.RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(FrameworkElement), 1);
            this.SetBinding(DataContextProperty, b);
        }
    }

1
<Run Text =“ {Binding ...}” /> />?您能解释一下优势吗?
菲利克斯·基尔

1
没有不同; 十年前,写此答案的时候,Run不支持Text属性的绑定!
josh2112 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.