2017-04-17 7 views
-1

私はWPFを初めて使用しています。私はボタンクリックでDataGridに行を追加するために1週間苦労しています。WPF Datagrid双方向バインディング:ボタンをクリックすると行が追加されます

マイデータグリッドは、このような長さのコードを追加するためのObservableCollection<FilterCriteria> FilterCriteriaList

申し訳ありませんにバインドされています。 WPFの初心者であるため、私はここで何が欠けているのかよくわかりません。

<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> 
:だから可能

限り多くの情報を提供しようとすると、これはこれはこれは、グリッドのXAMLコードである私のViewModelコード

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

ある

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

私FilterCriteriaクラスです

ボタンをクリックすると、グリッドに行を追加しようとしています。これを行うには、buttonAddFilter_ClickイベントにviewModel.FilterCriteriaList.Add(new FilterCriteria());を追加します。このコードは、DataGridに新しい行を追加します。しかし、私は新しく追加された行にいくつかの値を入力します。 FilterCriteriaListコレクションに追加されません

新しく追加された行のために双方向バインディングを行う方法を教えてください。

答えて

0

ここでは、FilterCriteriaListコレクションで変更した場合、そのセッターを呼び出さないようにしました。それが理由で、あなたの変更はDataGridに反映されていません。この問題を解決するには、FilterCriteriaListのコレクション変更イベントを購読する必要があります。同じことについての良い議論はthis SO postにあります。あなたがそれについてもっと詳しく知りたいのであれば、私に知らせてください。

関連する問題