If the LocalPrice is dependent on Rate then it should be a property of the Item class not the Header
Think about it a little. With your code you can have something like this
HeaderInvoice hi = new HaderInvoice();
List<Item> items = new List<Item>();
Item item1 = new Item();
item1.ID = 1;
item1.Price = "5.00";
items.Add(item1);
hi.Items = items;
You are expecting to be able to do this.
Decimal rate = hi.Items[0].LocalRate;
item1 doesn't know it in a collection. items doesn't know it is in a HeaderInvoice object. And hi doesn't know that it has any items.
You can still have one rate in the HeaderInvoice object by having it implement IList and override the Add method, something like this
private List<Item> m_Items;
public override int Add(Item item)
{
if(item.Rate == 0)
{
item.Rate = this.Rate;
}
m_Items.Add(item);
}
This also allows for each item to override the rate which is a better design.
Also, if you are expecting to use Price in a calculation it should not be a string. Use a double.