首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Silverlight数据绑定确保列表中项目的唯一性

使用Silverlight数据绑定确保列表中项目的唯一性
EN

Stack Overflow用户
提问于 2011-11-15 00:35:11
回答 1查看 401关注 0票数 1

在我的Silverlight4应用程序中,我有一个包含element列表的myClass类,这个element有一个标识它们的name-attribute。

代码语言:javascript
复制
class element
{
  string Name { get; set; }
}

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

要显示元素列表,我将myClass.elements数据绑定到Silverlight-Listbox:

代码语言:javascript
复制
<ListBox>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid>
        <TextBox Text="{Binding Name, FallbackValue=[None], Mode=TwoWay,
                       NotifyOnValidationError=true, ValidatesOnExceptions=true}" />
...

这样,对elementName的更改会自动传回。但是:我需要确保NamemyClass.elements中是唯一的(以及其他一些约束,这取决于myClass的属性。

当然,元素不知道谁包含它(我认为它也不应该知道)。所以我的问题是:如何检查元素的约束(在Name-property的setter中)?我真的很喜欢使用Silverlight-Databinding,因为它已经实现了错误通知。

提前谢谢你,

弗兰克

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-15 21:29:46

我建议element应该实现INotifyProperyChange,myClass应该侦听更改,然后检查重复,要么抛出异常,要么通过IDataErrorInfo、INotifyDataErrorInfo或自定义指示器指示错误。(因此,我假设您实现了观察者模式,这里的myClass是其项的观察者)。

对于自定义方式,可以在重复项中设置"IsDuplicate“属性,并将其绑定到背景(红色)颜色。如果用户故意要在此处设置重复名称,然后想要修复之前输入某些项目,则这可能对用户更有用。此外,如果您在列表中指定所有重复项,则会更容易找到重复项。

更新:

这是一个错误的指示。刚更改的项目有边框,它的副本-红色字体。

代码语言:javascript
复制
<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

代码语言:javascript
复制
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <TextBox Text="{Binding Path=Name, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnDataErrors=True}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>

下面是你的元素类:

代码语言:javascript
复制
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并调用重复检查。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8124813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档