如何在TextBlock MVVM Light中突出显示日期
本文关键字:显示 日期 Light TextBlock MVVM | 更新日期: 2023-09-27 18:07:28
我想根据当前日期突出显示日期的前景或背景颜色。我如何在我的ViewModel中做到这一点?
我可以用什么代码来突出显示日期?
这是我对整个项目的代码:
xaml:<Grid Margin="10,102,10,298">
<GridView ItemsSource="{Binding Calendar.DateCollection}">
<GridView.ItemTemplate>
<DataTemplate>
<Grid x:Name="dateGrid" Background="AntiqueWhite" Width="50" Height="30">
<TextBlock x:Name="txtDate" Text="{Binding}" Foreground="Black" VerticalAlignment="Center" HorizontalAlignment="Center" IsTapEnabled="True"/>
</Grid>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
</Grid>
完整的视图模型:
DateTime calendarDate;
public calendarViewModel()
{
calendarDate = DateTime.Today;
Initialize_Calendar(calendarDate);
}
private ObservableCollection<string> _DATECollection = new ObservableCollection<string>();
public ObservableCollection<string> DateCollection
{
get
{
return _DATECollection;
}
set
{
_DATECollection = value;
}
}
private ObservableCollection<Event> _eventCollection = new ObservableCollection<Event>();
public ObservableCollection<Event> EventCollection
{
get
{
return _eventCollection;
}
set
{
_eventCollection = value;
}
}
/// <summary>
/// The <see cref="CalendarMonthYear" /> property's name.
/// </summary>
public const string CalendarMonthYearPropertyName = "CalendarMonthYear";
private string _calendarMonthYear ;
/// <summary>
/// Sets and gets the CalendarMonthYear property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public string CalendarMonthYear
{
get
{
return _calendarMonthYear;
}
set
{
if (_calendarMonthYear == value)
{
return;
}
_calendarMonthYear = value;
RaisePropertyChanged(CalendarMonthYearPropertyName);
}
}
//button next month
private RelayCommand _nextMonth;
/// <summary>
/// Gets the NextMonth.
/// </summary>
public RelayCommand NextMonth
{
get
{
return _nextMonth
?? (_nextMonth = new RelayCommand(
() =>
{
calendarDate = calendarDate.AddMonths(1);
Initialize_Calendar(calendarDate);
}));
}
}
//Button previous month
private RelayCommand _previousMonth;
/// <summary>
/// Gets the PreviousMonth.
/// </summary>
public RelayCommand PreviousMonth
{
get
{
return _previousMonth
?? (_previousMonth = new RelayCommand(
() =>
{
calendarDate = calendarDate.AddMonths(-1);
Initialize_Calendar(calendarDate);
}));
}
}
/// <summary>
/// The <see cref="DATE" /> property's name.
/// </summary>
public const string DATEPropertyName = "DATE";
private string _date;
/// <summary>
/// Sets and gets the DATE property.
/// Changes to that property's value raise the PropertyChanged event.
/// </summary>
public string DATE
{
get
{
return _date;
}
set
{
if (_date == value)
{
return;
}
_date = value;
RaisePropertyChanged(DATEPropertyName);
}
}
public void Initialize_Calendar(DateTime date)
{
CalendarMonthYear = date.ToString("MMMM yyyy");
date = new DateTime(date.Year, date.Month, 1);
int dayOfWeek = (int)date.DayOfWeek + 1;
int daysOfMonth = DateTime.DaysInMonth(date.Year, date.Month);
int i = 1;
DateCollection.Clear();
for (int d = 1; d <= daysOfMonth; d++ )
{
if (i >= dayOfWeek && i < (daysOfMonth + dayOfWeek))
{
DATE = (i - dayOfWeek + 1).ToString();
DateCollection.Add(DATE);
}
else
{
DATE = "";
DateCollection.Add(DATE);
if (DATE == "")
{
daysOfMonth++;
}
}
i++;
}
}
private RelayCommand _dateClick;
/// <summary>
/// Gets the DateClick.
/// </summary>
public RelayCommand DateClick
{
get
{
return _dateClick
?? (_dateClick = new RelayCommand(
async() =>
{
EventCollection.Clear();
List<Event> E = await App.MobileService.GetTable<Event>().ToListAsync();
foreach(Event evnt in E)
{
if (evnt.Date.Date.Equals(DateTime.Today.Date))
{
EventCollection.Add(new Event
{
Id = evnt.Id,
EventName = evnt.EventName,
Desc = evnt.Desc,
Category = evnt.Category,
Location = evnt.Location,
StartingTime = evnt.StartingTime,
Date = evnt.Date
});
}
}
if(EventCollection.Count == 0 )
{
MessageDialog m = new MessageDialog("Empty", "No Events today!.");
await m.ShowAsync();
}
}));
}
}
DateConverter类:
public class DateColorConvertor : IValueConverter
{
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
return new object();
}
public object Convert(object sender, Type targetType, object parameter, string language)
{
DateTime currentItem = DateTime.Parse((sender as TextBlock).Text);
if (currentItem == DateTime.Now)
return new SolidColorBrush(Colors.Green);
else
return new SolidColorBrush(Colors.Red);
//throw new NotImplementedException();
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
您应该使用转换器来完成此操作,这涉及到以下步骤
1)创建转换器类,它应该实现IValueConverter
2)实现Convert
方法,据我所知,您希望基于当前日期执行此操作,因此它应该像
//假设条目中的日期是可解析的格式
DateTime currentItem = DateTime.Parse((sender as TextBlock).Text)
if(currentItem == DateTime.Now) // your comparison goes here
return new SolidColorBrush(Colors.Green);
else
return new SolidColorBrush(Colors.Red);
下一步在XAML代码中声明名称空间
xmlns:src="clr-namespace:PhoneApp1" // src is the name, PhoneApp1 the namespace
然后在网格中将其添加到资源
<Grid.Resources>
<src:DateColorConverter x:Key="DateColorConverter" />
</Grid.Resources>
最后在Textblock中设置前台为
Foreground="{Binding Converter={StaticResource DateColorConverter}}"
这里所做的本质上是,每个对象都将被绑定到你的列表中,经过检查并在运行时获得值。
你也可以试着检查这个例子,它是希腊文的,但是用一些谷歌翻译你就会明白它是如何工作的