C# 多个GridViewColumns中使用的通用数据模板
我有一个GridView,其中显示了一些值: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
<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>