96

我想在 WPF ItemsControl 中显示客户对象的列表。我为此创建了一个 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。有没有一种方法可以直接在 Binding 部分中连接数字和名称?

4

4 回答 4

185

您可能可以使用 StringFormat 属性(在 .NET 3.5 SP1 中)。有用的 WPF 绑定备忘单可以在这里找到。如果它没有帮助,您总是可以为您的对象编写自己的 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}">
于 2009-02-12T16:06:58.187 回答
75

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

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

显示器: 234-334-5566 (SSN)

于 2013-02-28T13:46:48.913 回答
9

请参阅我在代码中使用 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 >
于 2014-02-02T10:33:30.573 回答
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);
        }
    }
于 2009-02-12T16:50:42.030 回答