2015-02-03 2 views
0

WPF가 아닌 MVVM 응용 프로그램에서 수행중인 기본 기능을 사용하여 WPF MVVM 템플릿을 가져 오려고합니다. 이 경우 RowEditEnding 이벤트를 캡처하려고하는데, 변경된 행에있는 데이터의 유효성을 검사하기 위해 (나) 문제가 있습니다. 나는의 회원을 찾을 수있는 방법을 발견하지 않았습니다ICommand WPF ObservableCollection DataGrid에 바인딩

 public ObservableCollection<Document> oDoc 
    { 
     get 
     { 
      return _oDoc; 
     } 
    } 

    public ICommand DocRowEdit 
    { 
     get { return new DelegateCommand(DocumentRowEditEvent); } 
    } 

    public void DocumentRowEditEvent() 
    { 
     //How do I find the changed item? 
     int i = 1; 
    } 

: 핸들러에 완패에 위임 명령으로

 <DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" 
         ItemsSource="{Binding oDoc.View}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn x:Name="docIDColumn" Binding="{Binding DocId}" Header="ID" Width="65"/> 
      <DataGridTextColumn x:Name="DocumentNumberColumn" Binding="{Binding Number}" Header="Document Number" Width="*"/> 
      <DataGridTextColumn x:Name="altIDColumn" Binding="{Binding AltID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="Alt" Width="55"/> 
     </DataGrid.Columns> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="RowEditEnding"> 
       <i:InvokeCommandAction Command="{Binding DocRowEdit}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 
    </DataGrid> 

:

XAML에서

나는 이벤트 트리거를 사용했다 보류중인 변경 사항이있는 ObservableCollection (oDoc)입니다. DataGrid가 일부 유효성 검사를 수행하고 있음을 알 수 있습니다. 변경하려는 AltID 필드는 숫자가 아닌 값을 입력하면 빨간색으로 강조 표시됩니다. 그러나 검증을 처리하고 관련 메시지를 직접 처리하려고합니다. 내가 뭘 놓치고 있니? 어떻게 든 속성 변경 이벤트를 발생하기 위해 생각하지만,이 같은 배선하는 방법을 찾을 수 없습니다 :

 protected void RaisePropertyChangedEvent(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

마지막 두 코드 블록 내 뷰 모델 클래스에서있다, 그리고 나는이 작업을 수행하기 위해 노력하고있어 MainWindow 생성자에서 ViewModel을 인스턴스화하는 것 외에 다른 코드를 사용하지 않아도됩니다.

당신은 당신의 ViewModel에 속성을 추가 할 수 있습니다

답변

0

:

public Document CurrentDocument 
{ 
    get 
    { 
     return _currentDocument; 
    } 
    set 
    { 
     if (value != _currentDocument) 
     { 
      _currentDocument = value; 
      OnPropertyChanged("CurrentDocument") // If you implement INotifyPropertyChanged 
     } 
    } 
} 

을하고 당신이 당신의 데이터 그리드의 재산의 selectedItem에 바인딩 할 수 있습니다

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" 
         ItemsSource="{Binding oDoc.View}" SelectedItem="{Binding CurrentDocument}"> 

따라서 귀하의 편집 방법이 될 것입니다 :

public void DocumentRowEditEvent() 
{ 
    CurrentDocument.Number = DateTime.Now.Ticks; 
    /* And so on... */ 
} 

도움이되기를 바랍니다.

+0

좋습니다. 이 바인딩은 매우 강력합니다. OnPropertyChanged에 비해, 나는 또한 그것을 구현했으며, 그것이 무엇을하는지 완전히 이해할 수 있을지 확신 할 수 없다. 단순히 이벤트를 발생시키는 것으로 보입니다.이 이벤트를 처리하려면 DataGrid의 XAML 블록에 다른 이벤트 트리거를 추가해야합니다. 그게 맞습니까? 아니면 핸들러에서 캡처하는 또 다른 방법이 있습니까? 나는 디버거에서 그것을 사용하고 내 OnPropertyChanged 함수가'handler (this, new PropertyChangedEventArgs (propertyName));'를 호출했지만 get을 사용하는 방법을 알지 못한다. –

+0

동의합니다, 그것은 강력한 도구입니다! OnPropertyChanged 이벤트 (즉,'InotifyPropertyChanged' 인터페이스)를 사용하면 이벤트를 발생시키는 간단한 메커니즘이 아닙니다. 실제로 UI가 코드에 의해 수행 된 데이터 변경을 인식 할 수 있습니다. [여기] (https://msdn.microsoft.com/en-us/library/ms743695(v=vs.110) .aspx) 또는 [CodeProject] (http : //www.codeproject. com/Articles/29054/WPF-Data-Binding-Part)를 참조하십시오. –

관련 문제