C# 多值转换器问题
DataGrid的ItemsSource绑定到ObservableCollection。其中两个DataGridColumns绑定到集合中的DateTime属性,而第三个Columns使用IMultiValue转换器显示它们之间的日期差。我试图理解和解决的行为可以在场景2中找到 情景1:没有问题 视图已打开,并且DataGrid已包含记录,因为集合不是空的。如果将新对象添加到集合中,它将显示在DataGrid中,最后一列将正确显示日期差值 场景2:有问题 视图已打开,但DataGrid不包含任何记录,因为集合为空。如果将新对象添加到集合中,它将显示在DataGrid中,但最后一列(包含转换器)为空。但是,如果随后关闭并重新打开视图,则日期差异将在数据网格中正确显示 我希望在首次将对象添加到空集合时,date difference值显示在DataGrid列中。我错过了什么 对象类C# 多值转换器问题,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,DataGrid的ItemsSource绑定到ObservableCollection。其中两个DataGridColumns绑定到集合中的DateTime属性,而第三个Columns使用IMultiValue转换器显示它们之间的日期差。我试图理解和解决的行为可以在场景2中找到 情景1:没有问题 视图已打开,并且DataGrid已包含记录,因为集合不是空的。如果将新对象添加到集合中,它将显示在DataGrid中,最后一列将正确显示日期差值 场景2:有问题 视图已打开,但DataGrid不包含任何
public class Evaluation
{
public int ID { get; set; }
public DateTime BirthDate { get; set; }
public DateTime TestDate { get; set; }
}
视图模型
public class EvaluationViewModel : ViewModelBase
{
private ObservableCollection<Evaluation> evaluations;
public class EvaluationViewModel()
{
evaluations = Utility.Convert<Evaluation>(db.evaluationRepository.GetAllById(Subject.ID));
TestView = (CollectionView)new CollectionViewSource { Source = Evaluations }.View;
TestView.SortDescriptions.Add(new SortDescription("TestDate", ListSortDirection.Ascending));
}
public ObservableCollection<Evaluation> Evaluations
{
get { return evaluations; }
}
public CollectionView TestView { get; set; }
}
public EvaluationViewModel()
{
Evaluations = new ObservableCollection<Evaluation>();
TestView = (CollectionView)new CollectionViewSource { Source = Evaluations }.View;
TestView.SortDescriptions.Add(new SortDescription("TestDate", ListSortDirection.Ascending));
}
public ObservableCollection<Evaluation> Evaluations { get; }
public CollectionView TestView { get; set; }
我尝试了你的代码(2秒后将一个项目添加到ObservableCollection),它对我有效。这是我的密码:
MainWindow.xaml.cs
public MainWindow()
{
InitializeComponent();
DataContext = new EvaluationViewModel();
Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() => Thread.Sleep(2000))
.ContinueWith((t) =>
{
(DataContext as EvaluationViewModel).Evaluations.Add(
new Evaluation() { ID = 2, BirthDate = DateTime.Now.AddYears(-22), TestDate = DateTime.Now });
}, TaskScheduler.FromCurrentSynchronizationContext());
}
视图模型
public class EvaluationViewModel : ViewModelBase
{
private ObservableCollection<Evaluation> evaluations;
public class EvaluationViewModel()
{
evaluations = Utility.Convert<Evaluation>(db.evaluationRepository.GetAllById(Subject.ID));
TestView = (CollectionView)new CollectionViewSource { Source = Evaluations }.View;
TestView.SortDescriptions.Add(new SortDescription("TestDate", ListSortDirection.Ascending));
}
public ObservableCollection<Evaluation> Evaluations
{
get { return evaluations; }
}
public CollectionView TestView { get; set; }
}
public EvaluationViewModel()
{
Evaluations = new ObservableCollection<Evaluation>();
TestView = (CollectionView)new CollectionViewSource { Source = Evaluations }.View;
TestView.SortDescriptions.Add(new SortDescription("TestDate", ListSortDirection.Ascending));
}
public ObservableCollection<Evaluation> Evaluations { get; }
public CollectionView TestView { get; set; }
public EvaluationViewModel()
{
评估=新的可观察集合();
TestView=(CollectionView)新的CollectionViewSource{Source=Evaluations}.View;
添加(新的sortddescription(“TestDate”,ListSortDirection.升序));
}
公共ObservableCollection求值{get;}
公共集合视图测试视图{get;set;}
事实证明转换器不是问题所在,但转换器使用的其中一个值是DependencyProperty(我的坏毛病是直到现在才识别它),并引发DependencyProperty.UnsetValue错误。在向集合添加新实体时,我使用CreateNew()方法解决了这个问题,因此在将对象加载到DataGrid时,导航属性是已知的。好的,我的代码中一定有一些错误,我看不到,我现在正在查看。