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
컬렉션에 추가되지 않습니다.
새로 추가 된 행에 대해 양방향 바인딩을 수행하는 방법을 알려주십시오.