如何在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();
    }
}

如何在TextBlock MVVM Light中突出显示日期

您应该使用转换器来完成此操作,这涉及到以下步骤

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}}"

这里所做的本质上是,每个对象都将被绑定到你的列表中,经过检查并在运行时获得值。

你也可以试着检查这个例子,它是希腊文的,但是用一些谷歌翻译你就会明白它是如何工作的