Убедитесь, что уникальные элементы в списке с привязкой данных Silverlight - PullRequest
1 голос
/ 14 ноября 2011

в моем приложении Silverlight 4 у меня есть класс myClass, который содержит список element с. У этих element есть name -атрибут, который их идентифицирует.

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}" />
...

Таким образом, изменения Name из element автоматически распространяются обратно. Но: Мне нужно убедиться, что Name уникален в myClass.elements (и некоторых других ограничениях, в зависимости от свойств myClass.

Естественно, элементы не знают, кто его содержит (и, думаю, не должно знать). Итак, моя проблема: Как я могу проверить ограничения элементов (в установщике свойства Name)? Мне бы очень хотелось использовать привязку Silverlight-Datab, потому что в ней уже реализовано уведомление об ошибке.

Заранее спасибо,
Frank

1 Ответ

1 голос
/ 15 ноября 2011

Я бы предположил, что element должен реализовывать 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>

Вот ваш класс Элемента:

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 и вызвать проверку на дублирование.

...