Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多值转换器问题_C#_Wpf_Mvvm_Datagrid - Fatal编程技术网

C# 多值转换器问题

C# 多值转换器问题,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,DataGrid的ItemsSource绑定到ObservableCollection。其中两个DataGridColumns绑定到集合中的DateTime属性,而第三个Columns使用IMultiValue转换器显示它们之间的日期差。我试图理解和解决的行为可以在场景2中找到 情景1:没有问题 视图已打开,并且DataGrid已包含记录,因为集合不是空的。如果将新对象添加到集合中,它将显示在DataGrid中,最后一列将正确显示日期差值 场景2:有问题 视图已打开,但DataGrid不包含任何

DataGrid的ItemsSource绑定到ObservableCollection。其中两个DataGridColumns绑定到集合中的DateTime属性,而第三个Columns使用IMultiValue转换器显示它们之间的日期差。我试图理解和解决的行为可以在场景2中找到

情景1:没有问题

视图已打开,并且DataGrid已包含记录,因为集合不是空的。如果将新对象添加到集合中,它将显示在DataGrid中,最后一列将正确显示日期差值

场景2:有问题

视图已打开,但DataGrid不包含任何记录,因为集合为空。如果将新对象添加到集合中,它将显示在DataGrid中,但最后一列(包含转换器)为空。但是,如果随后关闭并重新打开视图,则日期差异将在数据网格中正确显示

我希望在首次将对象添加到空集合时,date difference值显示在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时,导航属性是已知的。

好的,我的代码中一定有一些错误,我看不到,我现在正在查看。