C# 多个GridViewColumns中使用的通用数据模板

C# 多个GridViewColumns中使用的通用数据模板,c#,wpf,xaml,listview,datatemplate,C#,Wpf,Xaml,Listview,Datatemplate,我有一个GridView,其中显示了一些值: <ListView ItemsSource="{Binding MyDataSource}"> <ListView.View> <GridView> <GridViewColumn Header="Date1" DisplayMemberBinding="{Binding Date1}" /> <GridViewColumn

我有一个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>
这里有一个问题:既然
DisplayMemberBinding
已经消失,我该如何告诉GridView显示哪个属性
GridViewColumn
没有
DataContext
属性

当然,我可以将属性的名称(
Date1
resp.
Date2
)放入DataTemplate,但这样一来,我需要为每个属性设置一个模板,这样就无法实现创建模板的全部目的


如果格式真的被广泛使用,那么您可以使用以下格式

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代码…

<local:DateTimeColumn DisplayMemberBinding="{Binding Date1}" />


(我不喜欢将格式设置为魔术字符串,但代码可以根据需要进行修改。)

与您的问题相关的是我的问题:我终于找到了解决方案。 我认为你不能回避为每一个这样的日期定义一个模板。但根据显示模板的复杂性,此解决方案将额外的
DataTemplate
s代码保持在最低限度:

<DataTemplate x:Key="DateX">
  <ContentPresenter ContentTemplate="{StaticResource MySpecialDate}" local:YourClass.AttachedDate="DateX"/>
</DataTemplate>

这些附加的
DataTemplate
使用附加属性,然后可由
DataTemplate
中的转换器使用“MySpecialDate”。
必须在代码隐藏中定义附加属性。我自己的问题的答案包含一个。

我经常问自己同样的问题,但我还没有找到令人满意的答案…(注意:没有尝试过。)是否可以重新定义类型(目标日期时间)的默认数据模板?此外,DisplayMemberBinding应该允许StringFormat。这对DisplayMemberBinding不起作用吗?@jberger:是的,StringFormat对DisplayMemberBinding起作用,这是我目前使用的解决方法。但是,这需要我为每个日期冗余地指定格式。明天我会看一看默认模板的方法,并向大家汇报…@Heinzi:我试着定义一个默认的DataTemplate,当绑定到ContentControl时它似乎可以工作。但是,DisplayMemberBinding似乎使用TextBlock和call.ToString()膨胀。
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}";
        }
    }
}
<local:DateTimeColumn DisplayMemberBinding="{Binding Date1}" />
<DataTemplate x:Key="DateX">
  <ContentPresenter ContentTemplate="{StaticResource MySpecialDate}" local:YourClass.AttachedDate="DateX"/>
</DataTemplate>