2012-03-10 3 views
0

두 DataGrid 열 사이에 유효성 종속성을 만들려고합니다.열 사이의 데이터 격자 유효성 검사 종속성을 만들 수 있습니다

첫 번째 열은 드롭 다운 상자입니다. (DataGridTemplateColumn) 두 번째는 텍스트 열입니다. (DataGridTextColumn)

동일한 행의 DataGrid 텍스트 열 셀의 유효성 검사를 강제하려면 코드의 드롭 다운 상자 이벤트에서 시도하고 있습니다.

도움 주셔서 감사합니다.

  <data:DataGridTemplateColumn Header="Type" > 
       <data:DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding Source={StaticResource TypeListContainer}, Path=TypeLists}" Loaded="TypeBoxLoaded" DropDownClosed="TypeBoxChanged"> 
         </ComboBox> 
        </DataTemplate> 
       </data:DataGridTemplateColumn.CellTemplate> 
      </data:DataGridTemplateColumn> 
      <data:DataGridTextColumn Header="Rule" Binding="{Binding RuleWrapper, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" x:Name="RuleCol" /> 

여기에 몇 가지주의해야 할 재산

public string RuleWrapper 
{ 
    get 
    { 
     return this.Rule; 
    } 
    set 
    { 
     //Required 
     if (value == null || value == string.Empty) 
     { 
      throw new ValidationException("Rule is required"); 
     } 
     //Match regular expression if type is channel 
     Regex reg = new Regex(@"^(51[01]|50[0-9]|[0-4]?[0-9][0-9]?)\.(51[01]|50[0-9]|[0-4]?[0-9][0-9]?)\.(51[01]|50[0-9]|[0-4]?[0-9][0-9]?)\.(51[01]|50[0-9]|[0-4]?[0-9][0-9]?)$"); 
     if (Type == "channel" && !reg.IsMatch(value)) 
      throw new ValidationException("Channel not matching the right format"); 

     //Match range if type is trunk 
     int intValue = -1; 
     //Match if is a number 
     if (int.TryParse(value, out intValue)) 
     { 
      //Match if number is in the range 
      if (intValue < 0 || intValue > 134217727) 
       throw new ValidationException("Trunk value must be between 0 and 134317727"); 
     } 
     else 
      throw new ValidationException("Trunk value must a an integer"); 
     this.Rule = value; 
    } 
} 
+0

ComboBox 컨트롤의 목적은 무엇입니까? 선택한 값도 유효해야합니까?귀하의 예제에서 당신은'RuleWrapper = RuleWrapper'를 호출하여 유효성 검사를 강제 할 수 있습니다,하지만 그것이 당신이 필요로하는 것인지 확신하지 못합니다. – vorrtex

+0

combox 상자를 선택하면 규칙에 대해 다른 유효성 검사가 트리거됩니다. 그래서 RuleWrapper = RuleWrapper를 사용하여 코드의 유효성을 강제로 확인한 후에 ValidationException이 발생하지만 DataGrid에 올바르게 표시되도록 처리하는 방법을 모르겠습니다. – Stainedart

+0

IDataErrorInfo를 사용하면 유효성 검사를 강제하는 방법을 알고 있습니다. INotifyDataErrorInfo 인터페이스. 이러한 유효성 검사가 인터페이스에 의해 수행되도록이 유효성 검사를 완전히 다시 작성하면 어떻게 생각하십니까? 그러면 모든 유효성 검사 코드를 다시 작성해야합니다. – vorrtex

답변

2

(난 아직 검증에 대해 배우고, 그래서 수정 될 서)입니다.

  • WPF는 ValidationException를 지원하지 않습니다. 바인딩의 ValidatesOnExceptions = TRUE 설정

  • 은 (a 번호 문자열 변환 같은) 내부에서 사용하는 기본 변환기에 예외를 처리한다.

  • 자신의 변환기에서 예외가 발견되지 않아 앱 이 다운 될 수 있습니다.

  • 검증은 IDataErrorInfo, 를 사용하여 처리됩니다 INotifyDataErrorInfo (실버 라이트와 WPF 4.5) 또한 나는 순간에 WPF의 관점에서 답변을하고있어 ValidationRule

. 나중에 Silverlight에서 테스트 해 보겠습니다.

MSDN은 놀랍게도 여기에 약 binding and validation이라는 좋은 기사가 있습니다.

두 개의 텍스트 열 사이의 유효성 검사 종속성을 보여주는 예제입니다 (간단히하기 위해). 두 번째 열은 읽기 전용이지만 첫 번째 열로 인한 유효성 검사 오류를 보여줍니다. 내가보기 모델/INotifyPropertyChange 지원을 위해 MVVM 빛을 사용하므로 자신의 구현 (_prop = 값 세트 (() => ...의 내 사용을 대체하고있어

<Grid> 
    <Grid.DataContext> 
     <Samples:DataGridValidationViewModels/> 
    </Grid.DataContext> 

    <DataGrid AutoGenerateColumns="False" ItemsSource={Binding Items}> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Column 1" Binding="{Binding Column1, ValidatesOnDataErrors=True}" /> 
      <DataGridTextColumn IsReadOnly="True" Header="Column 2" Binding="{Binding Column2, ValidatesOnDataErrors=True}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

, RaisePropertyChanged를 ("문자열 "). 등)

읽기 전용 속성에 속성 변경 이벤트를 발생하는 유효성 검사가 유용 해당 속성에 일이 발생합니다

public class DataGridValidationViewModels 
{ 
    public DataGridValidationViewModels() 
    { 
     Items = new ObservableCollection<DataGridValidationViewModel> 
        { 
         new DataGridValidationViewModel(), 
         new DataGridValidationViewModel(), 
         new DataGridValidationViewModel(), 
         new DataGridValidationViewModel(), 
         new DataGridValidationViewModel(), 
         new DataGridValidationViewModel(), 
         new DataGridValidationViewModel(), 
        }; 

    } 

    public IEnumerable<DataGridValidationViewModel> Items { get; set; } 
} 

public class DataGridValidationViewModel : ViewModelBase, IDataErrorInfo 
{ 
    public DataGridValidationViewModel() 
    { 
     _column1 = "Column 1"; 
     _column2 = "Column 2"; 
    } 

    private string _column1; 

    public string Column1 
    { 
     get { return _column1; } 
     set 
     { 
      Set(() => Column1, ref _column1, value); 
      Column2 = value; 
     } 
    } 

    private string _column2; 

    public string Column2 
    { 
     get { return _column2; } 
     private set{ Set(()=>Column2, ref _column2, value);} 
    } 

    #region Implementation of IDataErrorInfo 

    public string this[string columnName] 
    { 
     get 
     { 
      switch (columnName) 
      { 
       case "Column1": 
        return Column1 == "Error" ? "There's an error in column 1!" : string.Empty; 

       case "Column2": 
        return Column1 == "Error" ? "There's an error in column 2!" : string.Empty; 
      } 

      return string.Empty; 
     } 
    } 

    public string Error 
    { 
     get { return string.Empty; } 
    } 

    #endregion 
} 

당신이 열 1의 텍스트를 변경

. "오류"수신 :

enter image description here

+0

이 기사 http://www.codeproject.com/Articles/30905/WPF-DataGrid-Practical-Examples#exception에는 DataGrid 유효성 검사에 대한 유용한 정보가 있습니다. ValidationException이 작동하지 않는다는 나의 주장을 확인해야 할 수도 있습니다 :) – Phil

+0

Phil에게 대답 해 주셔서 감사합니다. 필자가 제공 한 링크를 읽고 있습니다. – Stainedart

+0

Hey Phil, 귀하의 충고에 따라 계속해서 INotifyDataErrorInfo 인터페이스를 구현했지만 여전히 문제가 발생했습니다 http://stackoverflow.com/questions/9670118/inotifydataerrorinfo-not-raising-error-changed-in-code-behind – Stainedart

관련 문제