Я новичок в DataGrids. После долгих поисков я не могу этого сделать.
Моя цель: я хочу иметь возможность дважды щелкнуть по одной встрече, содержащейся в любой ячейке. (Двойной щелчок откроет окно редактирования).
Проблема: я хочу использовать DataTable в качестве ItemsSource для DataGrid и хотел бы использовать стиль для каждой ячейки, который будет отображать 4 содержащихся объекта назначения и позволять выбирать каждый объект. Я не могу получить правильную привязку для ListView ItemsSource. (см. xaml в шаге 3).
(Кроме внешнего вида, я использую ListView, чтобы в конечном итоге разрешить выбор каждого объекта встречи).
Любая и ВСЕ помощь была бы очень признательна.
Заранее спасибо.
Назначение класса:
public class ScheduledAppointment : INotifyPropertyChanged
{
private readonly int rowNumber;
private readonly int columnNumber;
private readonly int appointmentNumber;
private string _firstName;
private string _mi;
private string _lastName;
private string _birthDate;
public string firstName
{
get { return _firstName; }
set { _firstName = value; RaisePropertyChanged(); }
}
public string lastName
{
get { return _lastName; }
set { _lastName = value; RaisePropertyChanged(); }
}
public string mi
{
get { return _mi; }
set { _mi = value; RaisePropertyChanged(); }
}
public string birthDate
{
get { return _birthDate; }
set { _birthDate = value; RaisePropertyChanged(); }
}
public ScheduledAppointment(string firstName, string mi, string lastName, string birthDate)
{
this.firstName = firstName;
this.mi = mi;
this.lastName = lastName;
this.birthDate = birthDate;
}
public ScheduledAppointment(int rowNumber, int columnNumber, int appointmentNumber)
{
this.rowNumber = rowNumber;
this.columnNumber = columnNumber;
this.appointmentNumber = appointmentNumber;
}
#region [INotifyPropertyChanged]
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
В каждой ячейке должно быть 4 встречи:
public class ScheduledAppointments : INotifyPropertyChanged
{
private DateTime _selectedDate;
private DataView _dataView;
public DataView DataView
{
get
{
return _dataView;
}
}
public ScheduledAppointments(DateTime currentTime)
{
this.selectedDate = currentTime;
MakeEmptySchedule(currentTime);
}
public DateTime selectedDate
{
get { return _selectedDate; }
set { _selectedDate = value; RaisePropertyChanged(); }
}
public void MakeEmptySchedule(DateTime currentTime)
{
int rowCount = 9; // 8:00 to 5:00 is 9 hours.
int columnCount = 4; // 4 columns per row
var t = new DataTable();
// Add columns to table.
t.Columns.Add(new DataColumn("0:00", typeof(Cell)));
t.Columns.Add(new DataColumn("0:15", typeof(Cell)));
t.Columns.Add(new DataColumn("0:30", typeof(Cell)));
t.Columns.Add(new DataColumn("0:45", typeof(Cell)));
// create the cells to be held by the table.
var cells = new Cell[rowCount, t.Columns.Count];
for (int i = 0; i < rowCount; i++)
{
for (int j = 0; j < columnCount; j++)
{
cells[i,j]=new Cell(i, j);
}
}
// Add data to DataTable
for (var r = 0; r < rowCount; r++)
{
var newRow = t.NewRow();
for (var c = 0; c < t.Columns.Count; c++)
{
newRow[c] = cells[r, c];
}
t.Rows.Add(newRow);
}
_dataView = t.DefaultView;
}
#region [INotifyPropertyChanged]
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
Используйте DataGrid для отображения объектов назначений - все объекты назначений должны отображаться в содержащей их ячейке.
<DataGrid Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="4" Grid.RowSpan="6"
ItemsSource="{Binding scheduledAppointments.DataView}" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="0:00" Width="230" IsReadOnly="True">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ListView ItemsSource="{Binding}">
<ListView.View>
<GridView>
<GridViewColumn Header="First" DisplayMemberBinding="{Binding rowNumber}" />
<GridViewColumn Header="Last" DisplayMemberBinding="{Binding columnNumber}" />
<GridViewColumn Header="BirthDate" DisplayMemberBinding="{Binding birthDate}" />
</GridView>
</ListView.View>
</ListView>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="0:15" Width="230" IsReadOnly="True">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ListView ItemsSource="{Binding}">
<ListView.View>
<GridView>
<GridViewColumn Header="First" DisplayMemberBinding="{Binding firstName}" />
<GridViewColumn Header="Last" DisplayMemberBinding="{Binding lastName}" />
<GridViewColumn Header="BirthDate" DisplayMemberBinding="{Binding birthDate}" />
</GridView>
</ListView.View>
</ListView>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="0:30" Width="230" IsReadOnly="True" >
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ListView ItemsSource="{Binding}">
<ListView.View>
<GridView>
<GridViewColumn Header="First" DisplayMemberBinding="{Binding firstName}" />
<GridViewColumn Header="Last" DisplayMemberBinding="{Binding lastName}" />
<GridViewColumn Header="BirthDate" DisplayMemberBinding="{Binding birthDate}" />
</GridView>
</ListView.View>
</ListView>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="0:45" Width="230" IsReadOnly="True">
<DataGridTemplateColumn.HeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ListView ItemsSource="{Binding}">
<ListView.View>
<GridView>
<GridViewColumn Header="First" DisplayMemberBinding="{Binding firstName}" />
<GridViewColumn Header="Last" DisplayMemberBinding="{Binding lastName}" />
<GridViewColumn Header="BirthDate" DisplayMemberBinding="{Binding birthDate}" />
</GridView>
</ListView.View>
</ListView>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>