我正在尝试将视图模型中的字符串绑定到DataGridTextColumn的StringFormat属性。但是,我在下面所做的不起作用。有没有办法在不使用转换器或资源的情况下执行此操作?如果没有,最简单的方法是什么?
<DataGridTextColumn Binding="{Binding Date, StringFormat={Binding DateFormat}}" />
答案 0 :(得分:2)
您无法将任何内容绑定到Binding
的属性,因为Binding
类不会从DependencyObject
继承。
从ContentControl
派生的控件(例如Label
)具有您可以绑定的ContentStringFormat
属性。如果DataGridTextColumn
来自ContentControl
但是它不是DataGridTemplateColumn
,那么这可以解决您的问题。
您可以将其DataTemplate
与Label
包含Label.ContentStringFormat
,并将DateFormat
绑定到您的<DataGridTemplateColumn Header="Date Template">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label
Content="{Binding Date}"
ContentStringFormat="{Binding DataContext.DateFormat,
RelativeSource={RelativeSource AncestorType=DataGrid}}"
/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
媒体资源:
DateFormat
但是当我更改viewmodel的DateFormat
属性时,这不会更新。我不知道为什么不,可能是我做错了什么。
这给我们留下了一个多值转换器。当我更改viewmodel的PropertyChanged
属性时,这会更新(两个相邻的列,一个更新而另一个没有 - 所以不要有人告诉我我没有这样做提高<Window.Resources>
<local:StringFormatConverter x:Key="StringFormatConverter" />
</Window.Resources>
)。
<DataGridTextColumn
Header="Date Text"
>
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource StringFormatConverter}">
<Binding Path="Date" />
<Binding
Path="DataContext.DateFormat"
RelativeSource="{RelativeSource AncestorType=DataGrid}" />
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
......等等等等......
DateTime
C#:
这会将任何字符串格式应用于任何值,而不仅仅是DateFormat
。我的"{0:yyyy-MM-dd}"
媒体资源正在返回{0}
。
此转换器的第一个绑定是您要格式化的值。
第二个绑定是format string parameter for String.Format()
。上面的格式字符串采用&#34;第0&#34;格式字符串后的参数 - DateTime
- 如果该值为DateTime
,则将其格式化为四位数年份,短划线,两位数月份,短划线和两位数的一天。 "My cast has {0:c} toes"
格式字符串本身就是一个主题; here's the MSDN page on the subject。
我给你的是最简单的写作方式,而且是最强大的。你可以传递一个double并给它一个格式字符串,如3.00999
,如果double是$3.01
,它会告诉你它的猫有String.Format()
个脚趾。
但是,在给予public class StringFormatConverter : IMultiValueConverter
{
public object Convert(object[] values,
Type targetType, object parameter, CultureInfo culture)
{
return String.Format((String)values[1], values[0]);
}
public object[] ConvertBack(object value,
Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
所有权力的同时,我编写格式字符串的工作有点复杂。这是一种权衡。
{{1}}