2011-11-14 43 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

相关问题