0

我有一个 linq 实体,包装在我的 ViewModel 中的一个属性中:

public NA_Header Na_Header
{
    get
    {
        _na_header=Job.NA_Headers.FirstOrDefault();
        return _na_header;
    }
    set { _na_header = value; }
}

我在我的视图中使用这个 Na_Header 属性来更新我的 GUI (xaml) 中的字段:

<Toolkit:DateTimePicker BorderBrush="Gray"  Grid.Column="1" Grid.Row="1"  Margin="5" VerticalAlignment="Top" Value="{Binding Path=Na_Header.JobStart, Mode=TwoWay, Converter={StaticResource thisNullDateConverter}, ValidatesOnDataErrors=True}"  Format="Custom" FormatString="MMM dd yyyy"/>
<Toolkit:DateTimePicker BorderBrush="Gray"  Grid.Column="1" Grid.Row="2"  Margin="5" VerticalAlignment="Top" Value="{Binding Path=Na_Header.JobEnd, Mode=TwoWay, Converter={StaticResource thisNullDateConverter},ValidatesOnDataErrors=True}" Format="Custom" FormatString="MMM dd yyyy"/>

请注意,我想针对 Na_Header.JobStart 和 Na_Header.JobEnd 验证此对象中的 2 个属性(这些是日期)。我将每个属性的 ValidatesOnDataErrors 设置为 true。

同样在 ViewModel 中,我实现了 IDataError:

public string this[string columnName]
{
    get
    {
        if (columnName == "Na_Header")
        {
            if (Na_Header.JobStart > Na_Header.JobEnd)
                return "Job Stat Date must be an earlier date than Job End Date";
        }
        return "";
    }
}

public string Error
{
    get { throw new NotImplementedException(); }
}

不幸的是,当对 JobStart 或 JobEnd 属性进行更改时,不会触发 DataError。我不认为我需要 NotifyPropertyChanged 因为它是一个 linq 实体(PropertyChanged 的​​东西是自动完成的)

有什么线索吗?

4

1 回答 1

0

但是你没有你所说的 Linq 实体。

IEnumerable First() 实际上返回一个类型为 T 的对象,尽管您没有显示字段 _na_header 的定义。我猜那是 Job/Na_Job。

我建议你有几个选择。

  1. 如果您的 Job 类是 ViewModel 命名空间的一部分(或者您只想在模型层发生更改时获取更新),则实现 INotifyPropertyChanged。这样 JobStart 和 JobEnd 将更新 Binding。

  2. 与其公开 NA_Header 属性,不如公开 JobStart 和 JobEnd (然后在您的 ViewModel 中实现 INotifyPropertyChanged,但我认为您已经这样做了)。这可能会通过隐藏模型层中的一些类来简化您的 ViewModel,或者它可能会使它更复杂,但有利于简化 XAML。

于 2012-12-10T19:02:23.300 回答