私は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
コレクションに追加されません
新しく追加された行のために双方向バインディングを行う方法を教えてください。