2011-10-31 65 views
0

的組合框,我試圖瞭解驗證是如何工作的組合框時,其ItemsSource綁定到複雜類型的ObserableCollection的。我使用RIA作爲將客戶端層連接到中間層的服務。也不知道這是否有所不同,組合框控件位於數據表單內。我已經做了很多的閱讀就這個問題和發現這篇文章是最有用的:http://www.run80.net/?p=93驗證在Silverlight 4

所以,首先我的實體:我有一個現場的裝飾,像這樣:

[Required] 
public virtual long FrequencyId { get; set; } 

[Include] 
[Association("TreatmentFrequencyToTreatmentRecordAssociation", "FrequencyId", "Id", IsForeignKey = true)] 
public virtual TreatmentFrequency Frequency 
{ 
    get 
    { 
     return this.frequency; 
    } 

    set 
    { 
     this.frequency = value; 

     if (value != null) 
     { 
      this.FrequencyId = value.Id; 
     } 
    } 
} 

現在我相信,我可以不設置關聯上的[必需的]註釋,而不是外鍵的id(上面的文章說的)。

實際治療頻率類看起來是這樣的:

public class TreatmentFrequency 
{ 
    [Key] 
    public virtual long Id { get; set; } 

    [Required] 
    [StringLength(10)] 
    public virtual string Code { get; set; } 

    [Required] 
    [StringLength(40)] 
    public virtual string Name { get; set; } 

    public override bool Equals(object obj) 
    { 
     obj = obj as TreatmentFrequency; 
     if (obj == null) 
     { 
      return false; 
     } 

     return this.Id == ((TreatmentFrequency)obj).Id; 
    } 

    public override int GetHashCode() 
    { 
     return this.Name.GetHashCode(); 
    } 
} 

我已經重寫的Equals和GetHashCode方法監守在另一篇文章也說,當一個集合中,你需要重寫等於匹配的關鍵否則,當您使用的SelectedItem雖然所有的值將集合中的項目,他們將兩種不同的情況,因此不與equals的默認實現匹配selectedItem屬性之間的相同。

現在我的XAML看起來像這樣:

<df:DataField Label="Frequency"> 
    <ComboBox SelectedItem="{Binding Path=CurrentItem.Frequency, Mode=TwoWay}" ItemsSource="{Binding Path=Frequencies}" DisplayMemberPath="Name" SelectedValue="{Binding Path=CurrentItem.FrequencyId, Mode=TwoWay}" SelectedValuePath="Id"/> 
</df:DataField> 

說實話上面並沒有太大的意義對我來說,我可以去掉的SelectedValue和SelectedValuePath如預期的形式,仍能正常工作(不驗證)我認爲選定的值會指向複雜的類型Eg CurrentItem.Frequency,然後是SelectedValuePath將是底層的「Name」屬性。不過,我也瞭解作者試圖做的是,[必需]標籤上沒有關聯,但外鍵ID例如CurrentItem.FrequencyId,所以它必須去某個地方。

現在最終compelexity是,這種形式是一個嚮導的一部分,因此我不能夠驗證整個對象,代替我手動必須驗證某些字段,它僅被填充在該特定向導步驟。要做到這一點,我創建的方法:

public void ValidateProperty(object value, string propertyName) 
{ 
    var results = new List<ValidationResult>(); 

    Validator.TryValidateProperty(value, new ValidationContext(this.TreatmentRecord, null, null) { MemberName = propertyName }, results); 

    foreach (var error in results) 
    { 
     this.TreatmentRecord.ValidationErrors.Add(error); 
    } 
} 

在我的視圖模型我有一個方法IsValid該向導之前調用被允許瀏覽到下一個步驟,然後我把上面的方法,像這樣:

public bool IsValid 
{ 
    get 
    { 
     this.treatmentRecordWizardContext.ValidateProperty(this.treatmentRecordWizardContext.TreatmentRecord.Frequency, "Frequency"); 
     this.treatmentRecordWizardContext.ValidateProperty(this.treatmentRecordWizardContext.TreatmentRecord.FrequencyId, "FrequencyId"); 

     this.OnPropertyChanged(() => this.CurrentItem); 

     if (this.treatmentRecordWizardContext.TreatmentRecord.ValidationErrors.Count == 0) 
     { 
      return true; 
     } 

     return false; 
    } 
} 

與所有上面的代碼時,組合框留空,驗證完全地忽略。我沒有模板本身真的讓我很茫然,爲什麼它不工作的下拉框,真正該解決方案的一部分是有過錯,難道是綁定或者是不正確定義的RIA該實體!

希望有人能幫助我花了太長時間試圖得到這個工作,我認爲這必須reqularly其他開發者,所以我希望它是一個簡單的修補程序來完成。

+0

我不確定驗證與'CurrentItem.Frequency'這樣的鏈接綁定是否起作用。此外,我會用'INotifyDataErrorInfo'接口使用mvvm方法,而不是數據註釋,因爲它更加靈活。 – vorrtex

回答

0

這實際上是一個簡單的問題,我認爲[必填]註釋會檢查關聯是否存在而不是空。它似乎只是檢查在這種情況下FrequencyId是否爲空。而且問題在於我使用了一個很長而不是可空的long(long?)。一旦我做出改變以使其可以爲空,驗證即使對於我來說沒有意義的綁定也開始按預期工作。如果有人能解釋他們那會很棒!

菲爾