2012-06-19 3 views
2

Я занимаюсь разработкой приложения с помощью WAF (WPF Application Framework), который основан на MVVM, MEF и т.д.Datagrid колонка связывания

я в настоящее время есть несколько объектов домена с аналогичными структурами, как показано ниже (укороченный для краткость):

public class MyBaseClass : INotifyPropertyChanged 
{ 
    private DateTime? _firstDateTime; 
    protected DateTime? firstDateTime 
    { 
     get { return _firstDateTime; } 
     set 
     { 
      _firstDateTime = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("FirstDateTime")); 
    } 

    private DateTime? _secondDateTime; 
    protected DateTime? secondDateTime 
    { 
     get { return _secondDateTime; } 
     set 
     { 
      _secondDateTime = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("SecondDateTime")); 
    } 

    public DateTime? FirstDateTime 
    { 
     get { return firstDateTime; } 
     set { firstDateTime = value; } 
    } 

    public DateTime? SecondDateTime 
    { 
     get { return secondDateTime; } 
     set { secondDateTime = value; } 
    } 
} 

public class MyBaseCollectionClass : INotifyPropertyChanged 
{ 
    private ObservableCollection<MyBaseClass> _baseClassObjectCollection; 
    protected ObservableCollection<MyBaseClass> baseClassObjectCollection 
    { 
     get { return _baseClassObjectCollection; } 
     set 
     { 
      _baseClassObjectCollection = value; 

      OnPropertyChanged(new PropertyChangedEventArgs("BaseClassObjectCollection")); 
     } 
    }   

    public ObservableCollection<MyBaseClass> BaseClassObjectCollection 
    { 
     get { return baseClassObjectCollection; } 
     set { baseClassObjectCollection = value; } 
    } 
} 

Тогда в моем ApplicationController у меня есть метод, который загружает в ObservableCollection в представлении-модели, как, например:

for (int i = 0; i <= 9; i++) 
{ 
    detailsViewModel.MyBaseClassObjects.Add(new MyBaseClass() 
              { 
               FirstDateTime = Convert.ToDateTime("05/2" + i + "/2012 09:00:00 AM"), 
               SecondDateTime = Convert.ToDateTime("05/2" + i + "/2012 04:30:00 PM") 
              }); 
} 

И еще один метод, который группирует большая коллекция в небольшие сгруппированных коллекции по дате:

detailsViewModel.MyBaseClassObjects 
       .GroupBy(baseObject => ((DateTime)baseObject.FirstDateTime).Date) 
       .Select(group => group.ToList()) 
       .ToList() 
       .ForEach(list => detailsViewModel.BaseObjectCollections 
         .Add(
           new MyBaseCollectionClass() 
           { BaseClassObjectCollection = new ObservableCollection<MyBaseClass>(list)} 
          ) 
         ); 

Затем в XAML моего взгляда, я иметь ItemsControl связана, как, например:

<ItemsControl ItemsSource="{Binding BaseObjectCollections}" ItemTemplate="{StaticResource ItemsTemplate}">      
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

An в ResourceDictionary для представления, у меня есть DataTemplate, объявленный как таковой (некоторые элементы опущены для ясности):

<DataTemplate x:Key="ItemsTemplate"> 
    <Grid DataContext="{Binding MyBaseClassObjects}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions>    

     <DataGrid Grid.Row="1" 
         Background="Transparent" 
         Style="{DynamicResource DataGridStyle}" 
         AlternatingRowBackground="Gainsboro" 
         AlternationCount="2" 
         AutoGenerateColumns="False" 
         HeadersVisibility="None" 
         ItemsSource="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}, Path=DataContext}"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Width=".25*"> 
        <DataGridTextColumn.Binding> 
         <MultiBinding Converter="{x:Static myConvNS:MultiValueTESTCONVERTER.Retrieve}"> 
          <Binding Path="FirstDateTime"/> 
          <Binding Path="SecondDateTime"/> 
         </MultiBinding> 
        </DataGridTextColumn.Binding> 
       </DataGridTextColumn>      
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</DataTemplate> 

ПРИМЕЧАНИЕ. В приведенном выше DataTemplate у меня есть многосвязывание, поэтому я могу видеть, какие значения передаются в преобразователь. Я понимаю, что не смогу добиться желаемого эффекта (описанного ниже), но я хотел бы пройти через привязку и посмотреть, что получал конвертер - ничего больше на данный момент. В конечном итоге то, что я пытаюсь выполнить (если возможно), заключается в том, что я хотел бы привязывать свой Datagrid таким образом, чтобы значения FirstDateTime и SecondDateTime отображались в одном столбце, чередуясь. Смотрите изображение ниже для визуальной помощи:

Desired Effect

Мои первые мысли были иметь некоторый другой общий объект, который выставляет одно свойство DateTime и ломаются мои базовые объекты (которые имеют два свойства DateTime) в случаях этот общий объект, а затем привязывается к коллекции этих общих объектов. Однако мне не нравится эта идея. Когда изменения происходят в свойствах DateTime моего базового объекта, мне нужно знать об этом, и я боюсь, что, разделив этот объект на два общих объекта, я потеряю возможность правильно отправлять и получать уведомления.

У кого-нибудь есть предложения или мысли?

ответ

0

Что относительно DataGridTemplateColumn и просто использовать StackPanel с двумя текстовыми полями?

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBox Text="{Binding FirstDateTime}"/> 
       <TextBox Text="{Binding SecondDateTime}"/> 
      </StackPanel> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

Извините, что не отвечал до сих пор, но я дам этот снимок и посмотрю, какие результаты я получу. Благодаря! – dgsmith15

Смежные вопросы