Answered by:
Binding template column in listview

Question
-
Hi,
i am trying to bind many template columns in listview :
<ListView x:Name="grdAppts" HorizontalAlignment="Left" Height="200" VerticalAlignment="Center" Width="350" Grid.RowSpan="2" Grid.Row="1" Grid.Column="0" SelectionMode="Multiple"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> </Style> </ListView.ItemContainerStyle> <ListView.View> <GridView> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <RadioButton IsChecked="False" GroupName="CheckedDoctor" Content="{Binding ApptTime}" ToolTip="{Binding ApptId}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <RadioButton IsChecked="False" GroupName="CheckedDoctor" Content="{Binding ApptTime}" ToolTip="{Binding ApptId}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <RadioButton Name="IsChecked" IsChecked="False" GroupName="CheckedDoctor" Content="{Binding ApptTime}" ToolTip="{Binding ApptId}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <RadioButton Name="IsChecked" IsChecked="False" GroupName="CheckedDoctor" Content="{Binding ApptTime}" ToolTip="{Binding ApptId}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <RadioButton Name="IsChecked" IsChecked="False" GroupName="CheckedDoctor" Content="{Binding ApptTime}" ToolTip="{Binding ApptId}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <RadioButton Name="IsChecked" IsChecked="False" GroupName="CheckedDoctor" Content="{Binding ApptTime}" ToolTip="{Binding ApptId}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> <GridViewColumn> <GridViewColumn.CellTemplate> <DataTemplate> <RadioButton Name="IsChecked" IsChecked="False" GroupName="CheckedDoctor" Content="{Binding ApptTime}" ToolTip="{Binding ApptId}"/> </DataTemplate> </GridViewColumn.CellTemplate> </GridViewColumn> </GridView> </ListView.View> </ListView>
I have created a class for binding type :
public class DataItem { public string ApptTime { get; set; } public string ApptId { get; set; } }
And I am trying to bind with this function :
private void CreateItemsForGrid(int Max, DateTime start) { //fill Appt by day List<List<Model.DataItem>> lTemp = new List<List<Model.DataItem>>(); List<DateTime> DataWeek = new List<DateTime>(); for (int i = 0; i < 7; i++) DataWeek.Add(start.AddDays(i)); foreach (DateTime date in DataWeek) { List<Model.DataItem> lApptWeek = new List<Model.DataItem>(); lApptWeek = (from myRow in pgQuickBookApptSearch.dtAppt.AsEnumerable() where myRow.Field<DateTime>("START_DATE").ToShortDateString() == date.ToShortDateString() select new Model.DataItem { ApptTime = myRow.Field<DateTime>("START_DATE").ToString("hh:mm"), ApptId = myRow.Field<Decimal>("APPOINTMENT_ID").ToString()}).ToList(); lTemp.Add(lApptWeek); } //fill grid row for (int i = 0; i < Max; i++) { var data = new List<Model.DataItem>(); if (i < LMax[0]) { if (lTemp[0][i] != null) data.Add(lTemp[0][i]);} else data.Add(new Model.DataItem { ApptId = "", ApptTime = "" }); if (i < LMax[1]) { if (lTemp[1][i] != null) data.Add(lTemp[1][i]);} else data.Add(new Model.DataItem { ApptId = "", ApptTime = "" }); if (i < LMax[2]) { if (lTemp[2][i] != null) data.Add(lTemp[2][i]);} else data.Add(new Model.DataItem { ApptId = "", ApptTime = "" }); if (i < LMax[3]) { if (lTemp[3][i] != null) data.Add(lTemp[3][i]);} else data.Add(new Model.DataItem { ApptId = "", ApptTime = "" }); if (i < LMax[4]) { if (lTemp[4][i] != null) data.Add(lTemp[4][i]);} else data.Add(new Model.DataItem { ApptId = "", ApptTime = "" }); if (i < LMax[5]) { if (lTemp[5][i] != null) data.Add(lTemp[5][i]);} else data.Add(new Model.DataItem { ApptId = "", ApptTime = "" }); if (i < LMax[6]) { if (lTemp[6][i] != null) data.Add(lTemp[6][i]);} else data.Add(new Model.DataItem { ApptId = "", ApptTime = "" }); grdAppts.Items.Add(data); } }
but the bind don't make any change in the grid and radio button appears empty!
Anyone has an idea to help me
Thanks.
Monday, April 25, 2016 11:40 AM
Answers
-
You should do this by binding ItemsSource of your listview.
Preferably setting the datacontext of the view to an instance of a viewmodel which exposes as a public property an observablecollection<ItemData>.
.
Your immediate problem here is you're adding a List when one thing is expected.
var data = new List<Model.DataItem>();
To Items:
grdAppts.Items.Add(data);
You should either add one single instance to Items at a time.
Or
Set ItemsSource to your list.
grdAppts.ItemsSource = data;
- Proposed as answer by DotNet Wang Thursday, May 5, 2016 7:27 AM
- Marked as answer by Xavier Xie-MSFT Thursday, May 5, 2016 12:18 PM
Monday, April 25, 2016 2:14 PM -
I am not sure that your CreateItemsForGrid method is supposed to do but since you are binding the Content property of the RadioButton in your XAML markup to the ApptTime source property of each DataItem object, the ItemsSource of the ListView should be set to an IEnumerable<DataItem>. Also, you should not set the ApptTime source to an empty string ("") because then the RadioButtons will appear empty.
You could try to add all DataItems to the same collection using the AddRange method. Something like this:
private void CreateItemsForGrid(int Max, DateTime start) { List<Model.DataItem> theItems = new List<Model.DataItem>(); //fill Appt by day List<DateTime> DataWeek = new List<DateTime>(); for (int i = 0; i < 7; i++) DataWeek.Add(start.AddDays(i)); foreach (DateTime date in DataWeek) { List<Model.DataItem> lApptWeek = new List<Model.DataItem>(); lApptWeek = (from myRow in pgQuickBookApptSearch.dtAppt.AsEnumerable() where myRow.Field<DateTime>("START_DATE").ToShortDateString() == date.ToShortDateString() select new Model.DataItem { ApptTime = myRow.Field<DateTime>("START_DATE").ToString("hh:mm"), ApptId = myRow.Field<Decimal>("APPOINTMENT_ID").ToString() }).ToList(); theItems.AddRange(lApptWeek); } //fill grid row for (int i = 0; i < Max; i++) { var data = new List<Model.DataItem>(); if (i < LMax[0]) { if (lTemp[0][i] != null) data.Add(lTemp[0][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[1]) { if (lTemp[1][i] != null) data.Add(lTemp[1][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[2]) { if (lTemp[2][i] != null) data.Add(lTemp[2][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[3]) { if (lTemp[3][i] != null) data.Add(lTemp[3][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[4]) { if (lTemp[4][i] != null) data.Add(lTemp[4][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[5]) { if (lTemp[5][i] != null) data.Add(lTemp[5][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[6]) { if (lTemp[6][i] != null) data.Add(lTemp[6][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); theItems.AddRange(data); } grdAppts.ItemsSource = theItems; }
Hope that helps.
Please remember to close your threads by marking helpful posts as answer and then start a new thread if you have a new question. Please don't ask several questions in the same thread.
- Proposed as answer by DotNet Wang Thursday, May 5, 2016 7:27 AM
- Marked as answer by Xavier Xie-MSFT Thursday, May 5, 2016 12:18 PM
Monday, April 25, 2016 8:43 PM
All replies
-
You should do this by binding ItemsSource of your listview.
Preferably setting the datacontext of the view to an instance of a viewmodel which exposes as a public property an observablecollection<ItemData>.
.
Your immediate problem here is you're adding a List when one thing is expected.
var data = new List<Model.DataItem>();
To Items:
grdAppts.Items.Add(data);
You should either add one single instance to Items at a time.
Or
Set ItemsSource to your list.
grdAppts.ItemsSource = data;
- Proposed as answer by DotNet Wang Thursday, May 5, 2016 7:27 AM
- Marked as answer by Xavier Xie-MSFT Thursday, May 5, 2016 12:18 PM
Monday, April 25, 2016 2:14 PM -
I am not sure that your CreateItemsForGrid method is supposed to do but since you are binding the Content property of the RadioButton in your XAML markup to the ApptTime source property of each DataItem object, the ItemsSource of the ListView should be set to an IEnumerable<DataItem>. Also, you should not set the ApptTime source to an empty string ("") because then the RadioButtons will appear empty.
You could try to add all DataItems to the same collection using the AddRange method. Something like this:
private void CreateItemsForGrid(int Max, DateTime start) { List<Model.DataItem> theItems = new List<Model.DataItem>(); //fill Appt by day List<DateTime> DataWeek = new List<DateTime>(); for (int i = 0; i < 7; i++) DataWeek.Add(start.AddDays(i)); foreach (DateTime date in DataWeek) { List<Model.DataItem> lApptWeek = new List<Model.DataItem>(); lApptWeek = (from myRow in pgQuickBookApptSearch.dtAppt.AsEnumerable() where myRow.Field<DateTime>("START_DATE").ToShortDateString() == date.ToShortDateString() select new Model.DataItem { ApptTime = myRow.Field<DateTime>("START_DATE").ToString("hh:mm"), ApptId = myRow.Field<Decimal>("APPOINTMENT_ID").ToString() }).ToList(); theItems.AddRange(lApptWeek); } //fill grid row for (int i = 0; i < Max; i++) { var data = new List<Model.DataItem>(); if (i < LMax[0]) { if (lTemp[0][i] != null) data.Add(lTemp[0][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[1]) { if (lTemp[1][i] != null) data.Add(lTemp[1][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[2]) { if (lTemp[2][i] != null) data.Add(lTemp[2][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[3]) { if (lTemp[3][i] != null) data.Add(lTemp[3][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[4]) { if (lTemp[4][i] != null) data.Add(lTemp[4][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[5]) { if (lTemp[5][i] != null) data.Add(lTemp[5][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); if (i < LMax[6]) { if (lTemp[6][i] != null) data.Add(lTemp[6][i]); } else data.Add(new Model.DataItem { ApptId = "", ApptTime = "x" }); theItems.AddRange(data); } grdAppts.ItemsSource = theItems; }
Hope that helps.
Please remember to close your threads by marking helpful posts as answer and then start a new thread if you have a new question. Please don't ask several questions in the same thread.
- Proposed as answer by DotNet Wang Thursday, May 5, 2016 7:27 AM
- Marked as answer by Xavier Xie-MSFT Thursday, May 5, 2016 12:18 PM
Monday, April 25, 2016 8:43 PM