ItemsControl
не поддерживает выбор.Вам нужно использовать ListBox
для этого.С этим вы можете связать свойство SelectedItem
вашего ListBox
со свойством SelectedDay
из вашей ViewModel .
XAML
<ListBox ItemsSource="{Binding Days}" SelectedItem="{Binding SelectedDay}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="5" Columns="7" FirstColumn="3"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Stretch">
<StackPanel Background="Transparent" HorizontalAlignment="Stretch">
<Label Content="{Binding DayNumber}"/>
<Label Content="{Binding Message}" VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</StackPanel>
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Вы можете получить SelectedItem
, имея свойство Bind в вашем ViewModel
.Что-то вроде
ViewModel
public class CalendarCellsViewModel : INotifyPropertyChanged
{
private string _dateTitle;
private ObservableCollection<CalendarDayData> _days;
private CalendarDayData _selectedDay;
public string DateTitle
{
get { return _dateTitle; }
set
{
_dateTitle = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(DateTitle)));
}
}
public ObservableCollection<CalendarDayData> Days
{
get { return _days; }
set
{
_days = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Days)));
}
}
public CalendarDayData SelectedDay
{
get { return _selectedDay; }
set
{
_selectedDay = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SelectedDay)));
}
}
public CalendarCellsViewModel()
{
DateTitle = $"{CultureInfo.CurrentCulture.DateTimeFormat.GetAbbreviatedMonthName(DateTime.Today.Month)} {DateTime.Today.Year}";
Days = new ObservableCollection<CalendarDayData>();
for (int i = 1; i <= 31; i++)
{
var day = new CalendarDayData { DayNumber = i, Message = "Test" };
if (i == DateTime.Today.Day)
SelectedDay = day;
Days.Add(day);
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
Модель
public class CalendarDayData
{
public int DayNumber { get; set; }
public int ReminderStart { get; set; }
public int ReminderFrequency { get; set; }
public string Message { get; set; }
}
Дополнительно
Если вы хотите дифференцировать ваш SelectedItem
, вы можете установить стиль ниже на Label
.
<Label Content="{Binding DayNumber}">
<Label.Style>
<Style TargetType="Label">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}"
Value="True">
<Setter Property="FontWeight" Value="ExtraBold"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>