2017-04-17 1 views
-1

WPF를 처음 사용합니다. 버튼 클릭으로 DataGrid에 행을 추가하는 데 일주일 동안 고민하고 있습니다.WPF Datagrid 양방향 바인딩 : 버튼 클릭시 행 추가

내 데이터 그리드는 같은 길이의 코드를 추가 ObservableCollection<FilterCriteria> FilterCriteriaList

죄송 바인딩됩니다. WPF에 익숙하지 않아, 정확히 내가 여기에서 누락 된 것이 확실하지 않습니다. 그래서 내 FilterCriteria 클래스 가능

많은 정보를 제공하기 위해

public class FilterCriteria : INotifyPropertyChanged 
    { 
     private NORTHWNDEntities context = new NORTHWNDEntities(); 

     private string columnName; 
     public string ColumnName 
     { 
      get 
      { 
       return columnName; 
      } 
      set 
      { 
       columnName = value; 
       RaisePropertyChanged("ColumnName"); 
      } 
     } 

     private string _operator; 
     public string Operator 
     { 
      get 
      { 
       return _operator; 
      } 
      set 
      { 
       _operator = value; 
       RaisePropertyChanged("Operator"); 
      } 
     } 

     private string inputValue; 
     public string InputValue 
     { 
      get 
      { 
       return inputValue; 
      } 
      set 
      { 
       inputValue = value; 
       RaisePropertyChanged("InputValue"); 
      } 
     } 

     private string selectedTable; 
     public string SelectedTable 
     { 
      get 
      { 
       return selectedTable; 
      } 
      set 
      { 
       selectedTable = value; 
       RaisePropertyChanged("SelectedTable"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void RaisePropertyChanged([CallerMemberName]string propertyName = "") 
     { 
      var handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

를이 내 뷰 모델 코드

public class ExportTablesViewModel : INotifyPropertyChanged 
    { 
     private NORTHWNDEntities context = new NORTHWNDEntities(); 

     private ObservableCollection<DatabaseTable> tableNameList; 
     public ObservableCollection<DatabaseTable> TableNameList 
     { 
      get 
      { 
       return tableNameList; 
      } 
      set 
      { 
       tableNameList = value; 
       RaisePropertyChanged("TableNameList"); 
      } 
     } 

     private ObservableCollection<string> selectedTableColumnList; 

     public ObservableCollection<string> SelectedTableColumnList 
     { 
      get 
      { 
       return selectedTableColumnList; 
      } 
      set 
      { 
       selectedTableColumnList = value; 
       RaisePropertyChanged("SelectedTableColumnList"); 
      } 
     } 


     private ObservableCollection<FilterCriteria> filterCriteriaList; 

     public ObservableCollection<FilterCriteria> FilterCriteriaList 
     { 
      get 
      { 
       return filterCriteriaList; 
      } 
      set 
      { 
       filterCriteriaList = value; 
       RaisePropertyChanged("FilterCriteriaList"); 
      } 
     } 


     private string selectedTableName; 

     public string SelectedTableName 
     { 
      get 
      { 
       return selectedTableName; 
      } 
      set 
      { 
       selectedTableName = value; 
       RaisePropertyChanged("SelectedTableName"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     protected void RaisePropertyChanged([CallerMemberName]string propertyName = "") 
     { 
      var handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 

되는이되는 노력이 그리드에 대한 XAML 코드 :

<DataGrid x:Name="dataGridFilters" CanUserAddRows="True" ItemsSource="{Binding FilterCriteriaList}" AutoGenerateColumns="False" HorizontalAlignment="Left" Margin="313,31,0,0" VerticalAlignment="Top" Height="261" Width="679"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Column"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <ComboBox x:Name="ComboBoxColumnName" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.SelectedTableColumnList}" 
             SelectedValue="{Binding Path=ColumnName,Mode =TwoWay,UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True,NotifyOnSourceUpdated=True}" SelectedValuePath="ColumnName"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="Operator"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox x:Name="TextBoxOperator" Text="{Binding Path=Operator,Mode =TwoWay,UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True,NotifyOnSourceUpdated=True}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="Value"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBox x:Name="TextBoxInputValue" Text="{Binding Path=InputValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, NotifyOnTargetUpdated=True,NotifyOnSourceUpdated=True}"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
     <Button x:Name="buttonAddFilter" Content="+" HorizontalAlignment="Left" Margin="958,76,0,0" VerticalAlignment="Top" Width="34" RenderTransformOrigin="0.5,0.5" Click="buttonAddFilter_Click"> 
     </Button> 

버튼을 클릭 할 때 그리드에 행을 추가하려고합니다. 이를 위해 buttonAddFilter_Click 이벤트에 viewModel.FilterCriteriaList.Add(new FilterCriteria());을 추가하고 있습니다. 이 코드는 DataGrid에 새 행을 추가합니다. 그러나 내가 새로 추가 된 행에 어떤 가치를 입력 할 때. FilterCriteriaList 컬렉션에 추가되지 않습니다.

새로 추가 된 행에 대해 양방향 바인딩을 수행하는 방법을 알려주십시오.

답변

0

여기서는 FilterCriteriaList 콜렉션에서 변경 한 내용을 setter를 호출하지 않습니다. 이것이 귀하의 변경 사항이 DataGrid에 반영되지 않은 이유입니다. 이 문제를 해결하려면 FilterCriteriaList의 콜렉션 변경 이벤트에 등록해야합니다. 같은 것에 대한 좋은 토론은 this SO post에서 찾을 수 있습니다. 그것을 통해 가서 그것에 대해 더 자세한 정보가 필요하면 알려주십시오.