0

在我的窗口中,我有一个简单的数据网格控件,其中包含一个 dateTimePicker 列和一个文本框列。我通过从 dateTimePicker 派生的月年字符串对数据网格中的行进行分组。这是列和分组的xaml.....

                <DataGridTemplateColumn Header="Date" Width="100">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <xctk:DateTimePicker IsEnabled="True" Format="Custom" FormatString="M/d/yyyy h:mm" Value="{Binding theDate, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Text" Width="150">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox TextWrapping="Wrap" AcceptsReturn="True" MaxLines="2" VerticalScrollBarVisibility="Auto" MaxLength="150" Text="{Binding theText, UpdateSourceTrigger=LostFocus, Mode=TwoWay}"></TextBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Name}" FontWeight="Bold" Padding="3"/>
                        </StackPanel>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </DataGrid.GroupStyle>

我有一个非常简单的类,其中包含文本字符串、datetimepicker 日期时间以及我动态创建的月份年份字符串。这是该类的 C# 代码...

public DateTime dueDate { get; set; }
public String task { get; set; }

private String _monthYear;
public String monthYear
{
    get { return dueDate.Month.ToString() + " - " + dueDate.Year.ToString(); }
}

这是我对分组的初始化

myCollectionView = CollectionViewSource.GetDefaultView(myObservableCollectionList);
myCollectionView.GroupDescriptions.Add(new PropertyGroupDescription("monthYear"));

MyDataGrid.ItemsSource = myCollectionView;
// In this case, myObservableCollectionList is an observable collection that holds the datagrid 
// rows. myCollectionView is an ICollectionView object

除了一个非常烦人的意外行为外,一切都正常工作。我不知道这是否是扩展 WPF 工具包中 DateTimePicker 控件的错误。

每当我更改 DateTimePicker 控件上的月份或年份并单击同一行中的新行或不同列时,我更改日期的行将不会被分组,但将保留在旧的月-年日期组中,直到我把它分类。如果它是一致的,这种行为会很好但是......

如果我要更改 DateTimePicker 控件上的月份或年份,然后通过 Tab 或单击相同的 DateTimePicker 控件(不更改任何内容),然后单击新行,旧行将被分组到一个新的月份 -年份类别。

我不确定,但我觉得这是 DateTimePicker 控件的一个错误,即使您不更改日期,当您通过控件切换时它也会调用某种事件。但是现在我很困惑,想知道是否有人对为什么会发生这种情况有任何见解。

*注意**我已经在使用和不使用 INotifyPropertyChanged 的​​情况下对此进行了测试,我确实实现了接口,并且在实现和不实现它的情况下都会发生这种行为,我想为了简单起见我会忽略它。

感谢您提供任何帮助!

4

1 回答 1

0

我已经解决了这个问题,它是由 _monthYear 和 monthYear 的使用引起的,所以我想每当我更改日期时,都会有多个调用来更改 _monthYear。无论出于何种原因,我假设与组描述有关......

taskScheduleCollection.GroupDescriptions.Add(new PropertyGroupDescription("monthYear"));

可能与 DateTimePicker 中的 ValueChanged 或类似事件混合会导致重新应用分组并创建新的行组(我对此不是 100% 确定)。

我通过删除 _monthYear 属性解决了这个问题,因为它是不必要的,并且只保留了一个依赖于日期的 monthYear 属性。

    public String monthYear
    {
        get { return _date.Month.ToString() + " - " + _date.Year.ToString(); }
    }

分组现在仅在我对列表集合进行排序时重新应用,这是我想要的一致行为。

于 2013-10-07T05:54:27.563 回答