DataGridTextColum绑定StringFormat

时间:2017-03-04 20:53:36

标签: wpf data-binding

我正在尝试将视图模型中的字符串绑定到DataGridTextColumn的StringFormat属性。但是,我在下面所做的不起作用。有没有办法在不使用转换器或资源的情况下执行此操作?如果没有,最简单的方法是什么?

<DataGridTextColumn Binding="{Binding Date, StringFormat={Binding DateFormat}}" />

1 个答案:

答案 0 :(得分:2)

您无法将任何内容绑定到Binding的属性,因为Binding类不会从DependencyObject继承。

ContentControl派生的控件(例如Label)具有您可以绑定的ContentStringFormat属性。如果DataGridTextColumn来自ContentControl但是它不是DataGridTemplateColumn,那么这可以解决您的问题。

您可以将其DataTemplateLabel包含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}}