在我的Silverlight4应用程序中,我有一个包含element列表的myClass类,这个element有一个标识它们的name-attribute。
class element
{
string Name { get; set; }
}
class myClass
{
List<element> elements { get; }
}要显示元素列表,我将myClass.elements数据绑定到Silverlight-Listbox:
<ListBox>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<TextBox Text="{Binding Name, FallbackValue=[None], Mode=TwoWay,
NotifyOnValidationError=true, ValidatesOnExceptions=true}" />
...这样,对element的Name的更改会自动传回。但是:我需要确保Name在myClass.elements中是唯一的(以及其他一些约束,这取决于myClass的属性。
当然,元素不知道谁包含它(我认为它也不应该知道)。所以我的问题是:如何检查元素的约束(在Name-property的setter中)?我真的很喜欢使用Silverlight-Databinding,因为它已经实现了错误通知。
提前谢谢你,
弗兰克
发布于 2011-11-15 21:29:46
我建议element应该实现INotifyProperyChange,myClass应该侦听更改,然后检查重复,要么抛出异常,要么通过IDataErrorInfo、INotifyDataErrorInfo或自定义指示器指示错误。(因此,我假设您实现了观察者模式,这里的myClass是其项的观察者)。
对于自定义方式,可以在重复项中设置"IsDuplicate“属性,并将其绑定到背景(红色)颜色。如果用户故意要在此处设置重复名称,然后想要修复之前输入某些项目,则这可能对用户更有用。此外,如果您在列表中指定所有重复项,则会更容易找到重复项。
更新:
这是一个错误的指示。刚更改的项目有边框,它的副本-红色字体。
<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>下面是你的元素类:
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并调用重复检查。
https://stackoverflow.com/questions/8124813
复制相似问题