I am trying to bind a textbox inside itemtemplate of my listview. As itemssource, I am using ObservableCollection. I have tried binding itemtemplate to datacontext itself by {Binding},yet it gives me InvalidOperationException. Here is the related snippet
<ListView Name="listOrder" ItemsSource="{Binding OrderBys,UpdateSourceTrigger=PropertyChanged}" HorizontalContentAlignment="Stretch">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Name="AddOrder" Header="Sıra Ekle" Click="AddOrder_Click" />
</ContextMenu>
</ListView.ContextMenu>
<ListView.ItemTemplate>
<DataTemplate>
<TextBox FontSize="10" Text="{Binding}"></TextBox>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Here is the related part from the ViewModel
public class ViewModel_ReportDesigner : ViewModelBase
{
//Tables
public List<string> Tables
{
get
{
Reporting.ReportUtils rr = new Reporting.ReportUtils();
return rr.GetChildList("IGAEntities");
}
}
private string _selectedTable;
public string SelectedTable {
get
{
return _selectedTable;
}
set
{
_selectedTable = value;
RaisePropertyChangedEvent("SelectedTable");
RaisePropertyChangedEvent("Fields");
}
}
//Fields
public ObservableCollection<string> Fields
{
get
{
Reporting.ReportUtils rr = new Reporting.ReportUtils();
if (SelectedTable != null)
{
return new ObservableCollection<string>(rr.GetChildList(SelectedTable));
}
return null;
}
}
//Number of Fields
private int _NumberOfFields;
public int NumberOfFields
{
get
{
return _NumberOfFields;
}
set
{
_NumberOfFields = value;
RaisePropertyChangedEvent("NumberOfFields");
}
}
public ObservableCollection<ReportField> getEmptyFieldList()
{
ObservableCollection<ReportField> list = new ObservableCollection<ReportField>();
for (int i = 1; i <= _NumberOfFields; i++)
{
list.Add(new ReportField("''", i.ToString()));
}
return list;
}
//Groups
private List<string> _Groups;
public List<string> Groups
{
get
{
if (_Groups == null)
{
_Groups = new List<string>();
}
return _Groups;
}set
{
_Groups = value;
RaisePropertyChangedEvent("Groups");
}
}
//TableCreators
private ObservableCollection<TableCreator> _TableCreators;
public ObservableCollection<TableCreator> TableCreators
{
get
{
if (_TableCreators == null)
_TableCreators = new ObservableCollection<TableCreator>();
return _TableCreators;
}
set
{
_TableCreators = value;
RaisePropertyChangedEvent("TableCreators");
}
}
private TableCreator _SelectedTableCreator;
public TableCreator SelectedTableCreator
{
get
{
return _SelectedTableCreator;
}
set
{
_SelectedTableCreator = value;
RaisePropertyChangedEvent("SelectedTableCreator");
}
}
internal void RaiseChanged(string v)
{
RaisePropertyChangedEvent(v);
}
}
Actually listview i am talking about is inside another listview. To make it all clear. When i add item to parent listview, I create an empty List and bind it to child listview. Then from context menu i add related elements like this
vm.SelectedTableCreator.OrderBys.Add("");
vm.RaiseChanged("TableCreators");
Edit: Now i realized that my binding is correct, only problem is that textbox change event will not fire after i change the text inside the textbox.