的組合框,我試圖瞭解驗證是如何工作的組合框時,其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其他開發者,所以我希望它是一個簡單的修補程序來完成。
我不確定驗證與'CurrentItem.Frequency'這樣的鏈接綁定是否起作用。此外,我會用'INotifyDataErrorInfo'接口使用mvvm方法,而不是數據註釋,因爲它更加靈活。 – vorrtex