连接字符串而不是使用TextBlocks堆栈

时间:2009-02-12 15:48:38

标签: .net wpf datatemplate

我想在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的简单列表(带有复选框)。有没有办法可以在绑定部分直接连接数字和名称?

4 个答案:

答案 0 :(得分:154)

您可以使用StringFormat属性(在.NET 3.5 SP1中)。并且有用的WPF绑定作弊套件可以找到here。 如果它没有用,你可以为你的对象编写自己的ValueConverter或自定义属性。

刚刚检查过,你可以使用StringFormat进行多重绑定。在你的情况下代码将是这样的:

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

答案 1 :(得分:56)

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

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

显示:234-334-5566(SSN)

答案 2 :(得分:8)

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

        <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 :(得分:3)

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

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

Here's原始班级:
Here是一些额外的改进。
这就是一段代码:

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);
        }
    }