Общий DataTemplate используется в нескольких GridViewColumns - PullRequest
5 голосов
/ 30 ноября 2011

У меня есть 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 соответственно 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>

Ответы [ 2 ]

1 голос
/ 20 апреля 2012

Относящийся к вашему вопросу мой: Передайте несколько ресурсов в DataTemplate , для которого я наконец-то нашел решение. Я думаю, что вы не можете обойти определение шаблона для каждой такой даты. Но в зависимости от сложности вашего шаблона отображения это решение сводит дополнительный код DataTemplate s к минимуму:

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

Эти дополнительные DataTemplate используют присоединенное свойство, которое затем может использоваться конвертером в DataTemplate «MySpecialDate». Присоединенное свойство должно быть определено в коде позади. Ответ на мой собственный вопрос содержит полный пример .

0 голосов
/ 01 декабря 2011

Если формат действительно так широко используется, то вы можете использовать следующие

In 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}" />

(Мне не нравится формат как магическая строка, но код может быть изменен по мере необходимости.)

...