繁体   English   中英

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

[英]How to highlight dates in a TextBlock MVVM Light

我想突出显示基于当前日期的日期的前景色或背景色。 如何在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>

完整的ViewModel:

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设置为

Foreground="{Binding Converter={StaticResource DateColorConverter}}"

实质上,这里要做的是将每个对象绑定到您的列表中,进行检查并在运行时获取值。

您也可以尝试检查此示例该示例采用希腊语,但是通过一些Google翻译,您将了解其工作原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM