2

我正在使用基于 MVVM、MEF 等的 WAF(WPF 应用程序框架)开发应用程序。

我目前有几个具有类似结构的域对象,如下所示(为简洁起见缩短):

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>

在视图的 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 值可以交替显示在同一列中。有关视觉帮助,请参见下图:

所需效果

我最初的想法是让一些其他通用对象公开单个 DateTime 属性并将我的基础对象(具有两个 DateTime 属性)分解为该通用对象的实例,然后绑定到这些通用对象的集合。不过,我不喜欢这个主意。当我的基础对象上的任一 DateTime 属性发生更改时,我需要了解它,我担心通过将此对象拆分为两个通用对象,我将失去正确发送/接收通知的能力。

有人有什么建议或想法吗?

4

1 回答 1

0

DataGridTemplateColumn 和你的两个文本框一起使用 StackPanel 怎么样?

<DataGridTemplateColumn>
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBox Text="{Binding FirstDateTime}"/>
                <TextBox Text="{Binding SecondDateTime}"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
于 2012-06-19T13:56:56.467 回答