我有一个显示一些值的GridView:
<ListView ItemsSource="{Binding MyDataSource}">
<ListView.View>
<GridView>
<GridViewColumn Header="Date1" DisplayMemberBinding="{Binding Date1}" />
<GridViewColumn Header="Date2" DisplayMemberBinding="{Binding Date2}" />
...other Columns, not necessarily containing dates...
</GridView>
</ListView.View>
</ListView>
这很好用。现在我想创建一个以特定方式格式化日期的数据模板:
<DataTemplate x:Key="MySpecialDate">
<TextBlock Text="{Binding StringFormat={}{0:yyyy.MM.dd}}" />
</DataTemplate>
只要指定CellTemplate
,添加DisplayMemberBinding
就无效。因此,我必须删除DisplayMemberBinding
属性:
<GridViewColumn Header="Date1" CellTemplate="{StaticResource MySpecialDate}" />
<GridViewColumn Header="Date2" CellTemplate="{StaticResource MySpecialDate}" />
以下是问题:现在DisplayMemberBinding
已消失,如何告诉GridView要显示哪个属性? GridViewColumn
没有DataContext
属性。
当然,我可以将属性的名称(Date1
resp。Date2
)放入DataTemplate中,但是我需要为每个属性设置一个模板,这样做会破坏整个目的。拥有模板。
<!-- I don't want that -->
<DataTemplate x:Key="MySpecialDate1">
<TextBlock Text="{Binding Date1, StringFormat={}{0:yyyy.MM.dd}}" />
</DataTemplate>
<DataTemplate x:Key="MySpecialDate2">
<TextBlock Text="{Binding Date2, StringFormat={}{0:yyyy.MM.dd}}" />
</DataTemplate>
答案 0 :(得分:1)
与您的问题相关的是我的:Pass multiple resources into a DataTemplate我终于找到了解决方案。
我认为你不能为每个这样的日期解决模板的定义。但是,根据显示模板的复杂性,此解决方案可将额外的DataTemplate
代码保持在最低限度:
<DataTemplate x:Key="DateX">
<ContentPresenter ContentTemplate="{StaticResource MySpecialDate}" local:YourClass.AttachedDate="DateX"/>
</DataTemplate>
这些额外的DataTemplate
使用附加属性,然后可以由DataTemplate
“MySpecialDate”中的转换器使用。
附加属性必须在后面的代码中定义。我自己的问题的答案包含complete example。
答案 1 :(得分:0)
如果格式真的被广泛使用,那么您可以使用以下
在DateTimeColumn.cs
public class DateTimeColumn : GridViewColumn
{
protected override void OnPropertyChanged(PropertyChangedEventArgs e)
{
base.OnPropertyChanged(e);
if (Equals(e.PropertyName, "DisplayMemberBinding") && DisplayMemberBinding != null)
{
DisplayMemberBinding.StringFormat = "{0:yyyy.MM.dd}";
}
}
}
XAML code...
<local:DateTimeColumn DisplayMemberBinding="{Binding Date1}" />
(我不喜欢格式为魔术字符串,但可以根据需要修改代码。)