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