私は ObservableCollection を DataGrid にバインドしており、実行時に実際の行を使用して行を追加できるようにしたいと考えています。ただし、空白行は表示されないため、ユーザーは行を追加できません。これについては既に調査済みで、CanUserAddRows=true と IsReadOnly=false を追加しました。CostCenter オブジェクトの空のコンストラクターも追加しましたが、まだ機能していません。以下のコードは、私がこれまでに持っているものです。
XAML の場合:
<Window.Resources>
<CollectionViewSource x:Key="jobItemViewSource1" d:DesignSource="{d:DesignInstance my:JobItem, CreateList=True}" />
<CollectionViewSource x:Key="CostCenterListViewSource" Source="{Binding Path=CostCenterList, Source={StaticResource jobItemViewSource1}}" />
</Window.Resources>
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Source={StaticResource CostCenterListViewSource}}" Name="costCenterListDataGrid" CanUserResizeRows="False" CanUserAddRows="True" CanUserDeleteRows="True" Background="LightGray" IsReadOnly="False">
<DataGrid.Columns>
<DataGridTextColumn x:Name="nameColumn" Binding="{Binding Path=Name, Mode=TwoWay}" Header="Cost Center" />
<DataGridTextColumn x:Name="glCodeColumn" Binding="{Binding Path=GlCode, Mode=TwoWay}" Header="Gl Code"/>
<DataGridTextColumn x:Name="costCenterPercentageColumn" Binding="{Binding Path=CostCenterPercentage, Mode=TwoWay}" Header="%"/>
</DataGrid.Columns>
</DataGrid>
コード ビハインドでは、datacontext を設定しました。
costCenterListDataGrid.DataContext = item.CostCenterList;
JobItem クラス:
private ObservableCollection<CostCenter> costCenterList;
public JobItem()
{
costCenterList = new ObservableCollection<CostCenter>();
}
public ObservableCollection<CostCenter> CostCenterList
{
get { return costCenterList; }
set
{
costCenterList = value;
}
}
そして、CostCenter クラスには次のものがあります。
public CostCenter()
{
afes = new ObservableCollection<Afe>();
}
public CostCenter(ObservableCollection<Afe> afes, string glCode)
{
this.afes = afes;
this.glCode = glCode;
}
public string Name
{
get { return name; }
set
{
if (String.IsNullOrEmpty(Name) || !Name.Equals(value))
{
name = value;
OnPropertyChanged("Name");
}
}
}
public ObservableCollection<Afe> Afes
{
get { return afes; }
set { afes = value; }
}
public string GlCode
{
get { return glCode; }
set
{
if (String.IsNullOrEmpty(GlCode) || !GlCode.Equals(value))
{
glCode = value;
OnPropertyChanged("GlCode");
}
}
}
public double TotalPercentage
{
get { return totalPercentage; }
set
{
if (totalPercentage + value <= 100)
{
totalPercentage += value;
}
}
}
public double CostCenterPercentage
{
get { return cPercentage; }
set
{
if (CostCenterPercentage != value)
{
cPercentage = value;
OnPropertyChanged("CostCenterPercentage");
}
}
}
無関係なコードを省略しようとしましたが、OnPropertyChanged メソッドは他のコードで使用したように機能しています。JobItem の datacontext も機能していますが、このスニペットにも追加していません。