Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单的WPF格式问题_Wpf_Xaml_Formatting - Fatal编程技术网

简单的WPF格式问题

简单的WPF格式问题,wpf,xaml,formatting,Wpf,Xaml,Formatting,如何在StackPanel中的TextBlock控件中为绑定值添加前缀,而不为前缀使用单独的控件 例如,假设我有一个对话框,它使用树状视图显示书籍列表,顶部节点是标题,其他书籍属性(ISBN、作者等)有一组从属节点 我的绑定工作正常,但我的用户希望图书属性列表垂直堆叠,而且,很明显,他希望每个属性节点在值之前都有一个描述性前缀(例如,“Author:Erich Gamma”而不仅仅是“Erich Gamma”)。在我的HDT和DT元素中,我使用StackPanel和TextBlock控件来显示值

如何在StackPanel中的TextBlock控件中为绑定值添加前缀,而不为前缀使用单独的控件

例如,假设我有一个对话框,它使用树状视图显示书籍列表,顶部节点是标题,其他书籍属性(ISBN、作者等)有一组从属节点

我的绑定工作正常,但我的用户希望图书属性列表垂直堆叠,而且,很明显,他希望每个属性节点在值之前都有一个描述性前缀(例如,“Author:Erich Gamma”而不仅仅是“Erich Gamma”)。在我的HDT和DT元素中,我使用StackPanel和TextBlock控件来显示值

我必须为每个属性的前缀使用单独的TextBlock控件吗

<!-- Works, but requires 2 controls to display the book author and the prefix stacks above the author -->
<TextBlock Text="Author: "/><TextBlock Text="{Binding Path=Author}" />  

或者有没有一种方法可以为每个节点使用一个TextBlock控件来实现这一点

<!-- only one control, but doesn't work -->
<TextBlock Text="Author:  {Binding Path=Author}" />  

我知道这一定是一个常见的问题,我在谷歌上搜索了它,并在我的三本WPF书籍中进行了搜索,但我想我不知道如何正确地搜索我想说的话


谢谢

快速简单方法:使用转换器,并将前缀文本作为转换器参数传入。然后在转换器中,您所要做的就是将转换器参数文本前置到绑定文本

<TextBlock Text="{Binding Path=Title, Converter={StaticResource MyTextConverter}, ConverterParameter=Title}" />
<TextBlock Text="{Binding Path=ISBNNumber, Converter={StaticResource MyTextConverter}, ConverterParameter=ISBN}" />
<TextBlock Text="{Binding Path=AuthorName, Converter={StaticResource MyTextConverter}, ConverterParameter=Author}" />

public class MyTextConverter : IValueConverter 
{

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is string)
        {
            return string.Format("{0}{1}{2}", parameter ?? "", !string.IsNullOrEmpty(parameter) ? " : " : "", value);
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

公共类MyTextConverter:IValueConverter
{
#区域转换器成员
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
if(值为字符串)
{
返回string.Format(“{0}{1}{2}”,参数??”!string.IsNullOrEmpty(参数)?“:”:”,值);
}
返回值;
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
抛出新的NotImplementedException();
}
#端区
}

这是我的想法,请原谅其中的任何小错误。这只需要一个文本块就可以完成。您所要做的就是将转换器包含在xaml文件的静态资源中。

如果您有.Net 3.5 SP1,您可以通过StringFormat轻松实现这一点

<TextBlock Text="{Binding Path=Title, StringFormat= Title: {0}}" />

你也可以这样做

<TextBlock>
  <TextBlock.Text>
    <MultiBinding StringFormat="Author: {0}, Title: {1}">
      <Binding Path="Author"/>
      <Binding Path="Title"/>
    </MultiBinding>
  </TextBlock.Text>
</TextBlock>

如果您没有使用SP1,
然后您可以使用ValueConverter

您的方法比我的方法更简洁:)+1,但您可能希望在绑定失败或读取null时提供回退值,您可以提供{binding FallbackValue=Something}。如果绑定失败,这将起作用。或者你可以使用优先级绑定,这正是我想要的。谢谢self注意:StringFormat参数的卷曲必须转义。很好的建议。我想对于任何比我现在做的更复杂的事情,我都需要这样做。谢谢