2012-12-10 132 views
0

我裹在,我在我的視圖模型的屬性LINQ的實體:驗證對LINQ的實體屬性

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"/> 

注意,我有2個屬性在這個對象中,我想驗證Na_Header.JobStart和Na_Header.JobEnd(這些是日期)。我的每個屬性的ValidatesOnDataErrors設置爲true。

另外在視圖模型我有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(); } 
} 

不幸的是,DataError不更改時的首次工或JobEnd性質的火災。我不認爲我需要NotifyPropertyChanged,因爲它是一個linq實體(PropertyChanged的東西是自動完成的)

任何線索?

回答

0

但是你沒有一個Linq實體,就像你放的那樣。

IEnumerable First()實際上是返回一個類型爲T的對象,雖然你不顯示你的字段_na_header的定義。我猜想那是一個Job/Na_Job。

我會建議你有幾個選擇。

  1. 如果你的工作類是您的視圖模型命名空間的一部分(或者你只是想更新時,它在你的模型層甚至改變),然後執行INotifyPropertyChanged。這樣JobStart和JobEnd將更新綁定。

  2. 爲什麼不公開NA_Header屬性,而不是暴露JobStart和JobEnd(然後在你的ViewModel中實現INotifyPropertyChanged,但我認爲你已經)。這可能會通過隱藏模型層中的某些類來簡化您的ViewModel,或者可能會使其更復雜,但是受益於簡化的XAML。

+0

我不需要INotifyPropertyChanged,因爲它是Linq系統的一部分,它會自動執行此操作。該屬性保存良好,它只是沒有解僱DateError的東西。我最終做了同樣的事情,就是在#2中做的,它只是爲JobStart和JobEnd創建屬性,並在這些屬性中調用「返回Na_Header.JobStart」(或Na_Header.JobEnd)。我試圖避免這樣做,因爲我需要以這種方式驗證其他事物,這意味着添加了更多的代碼,但也許這是唯一的方法。 *聳肩* –