2011-11-14 50 views
2

中的唯一項,我有一個類myClass,其中包含element s的列表。這個element有一個name-屬性來標識它們。在Silverlight 4應用程序中確保列表中包含Silverlight數據綁定

class element 
{ 
    string Name { get; set; } 
} 

class myClass 
{ 
    List<element> elements { get; } 
} 

要顯示的元素的列表,我數據綁定myClass.elements到Silverlight的列表框:

<ListBox> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
     <TextBox Text="{Binding Name, FallbackValue=[None], Mode=TwoWay, 
         NotifyOnValidationError=true, ValidatesOnExceptions=true}" /> 
... 

這樣,更改elementName自動傳播回。但我需要確保,該Name是獨特的myClass.elements(和一些更多的約束,取決於myClass性能

當然,這些元素不知道誰包含它(它不應該知道的。我認爲)。所以我的問題是:我如何檢查元素的約束(在Name屬性的setter中)?我真的想使用Silverlight-Databinding,因爲它已經實現了錯誤通知。

在此先感謝,
弗蘭克

+0

有一個問題,如果用戶嘗試輸入重複項,您希望應用程序做什麼?您可以嘗試讓元素設置器引發一個事件,即容器類訂閱,以驗證該項目。 – EtherDragon

+0

應用程序不應保存該值,文本框應顯示一個錯誤(通過NotifyOnValidationError和ValidatesOnExceptions),所以我猜測setter需要提高錯誤。當我在二傳手中提出一個事件時,我無法在二傳手中反應驗證結果(不設置屬性,提高錯誤),是嗎? – Aaginor

回答

1

我建議element應該IMPL如果INotifyProperyChange和myClass應該監聽更改,然後檢查重複,通過IDataErrorInfo,INotifyDataErrorInfo或自定義指示符引發異常或指示錯誤。 (所以你實現Observer模式,我假設,myClass在這裏是它的項目的觀察者)。

對於自定義方式,可以在重複項目中設置「IsDuplicate」屬性並將其綁定到背景(紅色)顏色。如果他/她故意要在此設置重複名稱,然後想要修復之前輸入的某個項目,那對用戶來說可能更有用。此外,如果您在列表中指明所有內容,則會更容易找到重複項。

UPDATE:

下面是一個錯誤的指示。只是改變項目有邊界,重複它 - 紅色字體。

<Style TargetType="{x:Type TextBox}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Path=IsDuplicate}" Value="True"> 
      <Setter Property="Foreground" Value="Red" /> 
     </DataTrigger> 
     <Trigger Property="Validation.HasError" Value="true"> 
      <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, 
       Path=(Validation.Errors)[0].ErrorContent}"/> 
      <Setter Property="BorderBrush" Value="Red"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

這是項模板時,請注意ValidatesOnDataErrors

<ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <TextBox Text="{Binding Path=Name, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 

這裏是你的Element類:

class Element : INotifyPropertyChanged, IDataErrorInfo 
{ 
    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; 
     if(PropertyChanged != null) 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name")); 
     } 
    } 

    private bool _isDuplicate; 
    public bool IsDuplicate 
    { 
     get { return _isDuplicate; } 
     set 
     { 
      _isDuplicate = value; 
      PropertyChanged.Invoke(this, new PropertyChangedEventArgs("IsDuplicate")); 
     } 
    } 
    //IDataErrorInfo 
    public event PropertyChangedEventHandler PropertyChanged; 

    public string this[string columnName] 
    { 
     get 
     { 
      if (IsDuplicate) 
       return "Duplicate col" + columnName; 
      return null; 
     } 
    } 

    public string Error 
    { 
     get { return null; } 
    } 
} 

最後,myClass應該聽的PropertyChanged和調用重複檢查。

+0

嗨Mikalai,謝謝你的回答,這聽起來像一個好方法!我還不知道的是:當myClass指示一個(重複)錯誤時,我如何提高元素的(IDataErrorInfo)異常,以便它的文本框顯示它?目前,我在元素setter中拋出一個Exception,但是當myClass檢查重複項時,我不再是元素的setter。 – Aaginor

+0

我已經發布了回答文本的代碼 - 希望對我有幫助:) – mikalai

+0

啊,非常好的例子,非常感謝! IDataErrorInfo的實現非常有用,並且可能在其他部分派上用場:) – Aaginor

相關問題