2011-11-14 4 views
2

의 고유 항목을 확인하고 의 목록을 포함하는 myClass 클래스가 있습니다. 이 element에는 그 (것)들을 식별하는 name 속성이 있습니다. Silverlight 4 응용 프로그램에서 List with Silverlight Databinding

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

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

요소의 목록을 표시하려면, 나는 실버 - 목록 상자에 myClass.elements를 데이터 바인딩 :

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

이 방법의 elementName에 대한 변경 사항이 자동으로 전파됩니다. 그러나 : 나는 NamemyClass.elements에서 고유한지 반드시 확인해야합니다 (좀 더 제약, myClass의 특성에 따라

는 물론, 요소 (그것이 알고 있어야 그것을 포함 누구인지하지 않습니다. 내 문제는 : 그래서 이름 속성의 setter에 요소의 contraints를 확인할 수 있습니까? 나는 이미 오류 알림을 구현하기 때문에 Silverlight-Databinding을 사용하고 싶습니다.

사전에

감사합니다,
프랭크

+0

하나의 질문으로, 사용자가 복제본을 입력하려고 할 때 앱이 기대하는 바는 무엇입니까? 엘리먼트 셋터가 아이템을 확인하기 위해 컨테이너 클래스가 구독하는 이벤트를 일으키도록 시도 할 수있다. – EtherDragon

+0

앱이 값을 저장하지 않아야하고 텍스트 상자에 NotifyOnValidationError 및 ValidatesOnExceptions를 통해 오류가 표시되어야하므로 setter가 오류를 발생시켜야합니다. 나는 setter에서 이벤트를 발생시킬 때 setter에서 유효성 검사 결과에 반응 할 수 없다 (속성을 설정하지 않고 오류를 발생시키지 않음)? – Aaginor

답변

1

나는 element가 IMPL 것이 좋을 것 INotifyProperyChange 및 myClass은 변경 사항을 수신 한 다음 예외를 던지거나 IDataErrorInfo, INotifyDataErrorInfo 또는 사용자 지정 표시기를 통해 오류를 표시하여 중복 여부를 확인해야합니다. (Observer 패턴을 구현하기 때문에 여기 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주의 : myClass이하여 PropertyChanged을 듣고 중복 체크를 호출 할 필요가 마침내

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; } 
    } 
} 

그리고, :

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

가 여기 요소 클래스입니다.

+0

안녕 Mikalai, 대답 주셔서 감사합니다, 이것은 좋은 방법처럼 들리 네! 내가 아직 모르는 것은 : myClass가 (복제 중) 오류를 나타낼 때 요소에 대한 (IDataErrorInfo) 예외를 발생시켜 텍스트 상자에 표시하도록하려면 어떻게해야합니까?현재 Element setter에 Exception을 던지지만 myClass가 중복을 확인할 때 요소의 설정자가 아닙니다. – Aaginor

+0

텍스트에 응답하는 코드를 게시했습니다. 도움이 되길 바랍니다. – mikalai

+0

아, 아주 좋은 예, 많은 감사합니다! IDataErrorInfo의 구현은 매우 유용하며 다른 부분에서도 유용 할 수 있습니다. :) – Aaginor

관련 문제